我正在使用c#构建一个Windows窗体应用程序,我构建了许多自定义用户控件,我的GUI是这些用户控件的组合,问题是当我从主窗体设置此用户控件的事件时,事件没有fire,但是如果我从控件中设置该事件并将其设置为该控件内的所有项目的事件处理程序,那么它工作正常,并且我已经包装了控件,我应该深入设置事件和事件处理程序,实际上这将花费更多的开销“我不想要它”。 例如:
在主要形式中,我控制着他的名字“患者”,这是用户控制.. 如果我从主窗体设置此控件的click事件,它将不会触发
但是,如果我转到患者用户控件定义并定义自定义事件和事件处理程序,一切都很好
public event EventHandler PatientCliecked;
private void PatientClicked()
{
if (this.PatientCliecked != null)
this.PatientCliecked(new object(), new EventArgs());
}
private void ProcessPatientClickedEvent(object sender, EventArgs e)
{
PatientClicked();
}
我的问题是,还有其他方法可以做到这一点,或者这是.NET的逻辑吗?
答案 0 :(得分:1)
UserControl从Control类继承Click事件。它当然可以解雇,但这种情况不太可能发生。您的用户将改为单击UserControl内的控件。当你用其他控件覆盖整个UserControl表面时,它永远不会触发。
您可以简单地重定向Click事件以供自己使用。通过声明自己的事件,你已经尝试过的东西。这不是必需的,你可以这样做:
private void PatientClicked()
{
OnClick(this, EventArgs.Empty);
}
与所有名称以On开头且与事件名称相同的方法一样,引发Click事件。
答案 1 :(得分:0)
我会继续拍摄。
假设我们有UserControl
。说它看起来像这样:
现在,假设您为存在的4个不同控件编写了以下Click
个处理程序(Button
,ListView
,RadioButton
和{{1本身):
UserControl
为了澄清我在说什么,请检查public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
}
private void radioButton1_Click(object sender, EventArgs e) {
MessageBox.Show("RadioButton");
}
private void listView1_Click(object sender, EventArgs e) {
MessageBox.Show("ListView");
}
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("Button");
}
private void UserControl1_Click(object sender, EventArgs e) {
MessageBox.Show("UserControl");
}
}
文件的这个子集:
.designer.cs
考虑以下的肯定。
当您点击此蓝色区域时:
...
this.radioButton1.Click += new System.EventHandler(this.radioButton1_Click);
...
this.button1.Click += new System.EventHandler(this.button1_Click);
...
this.listView1.Click += new System.EventHandler(this.listView1_Click);
...
this.Click += new System.EventHandler(this.UserControl1_Click);
...
处理程序将被调用,您将看到“UserControl”消息框出现。
当您点击其他蓝色区域时:
“listView1_Click”处理程序将被调用,您将看到“ListView”消息框出现但是您将看不到“UserControl”消息框。
其余两个控件都是如此:按钮:
和radiobutton:
当您从最终容器的角度查看UserControl1_Click
并看到UserControl
事件,并且您要为其添加事件处理程序时,您应该期望与这里提供的Click
事件处理程序的那个。
如果您愿意,您可以为任何特定的子控件集创建一个自定义事件处理程序,并简单地将订阅和取消订阅重定向到该事件以及外部世界可能具有的任何处理程序:
UserControl1_Click
甚至以动态方式订阅处理程序到每个子控件 PLUS UserControl本身:
public event EventHandler SmallButtonsClick {
add {
this.radioButton1.Click += value;
this.button1.Click += value;
}
remove {
this.radioButton1.Click -= value;
this.button1.Click -= value;
}
}
public event EventHandler LargeStuffClick {
add {
this.listView1.Click += value;
}
remove {
this.listView1.Click -= value;
}
}
然后只使用周围世界:
public event EventHandler AnythingClick {
add {
this.Click += value;
foreach (var child in this.Controls)
child.Click += value;
}
remove {
this.Click -= value;
foreach (var child in this.Controls)
child.Click -= value;
}
}