3 .net c# events user-controls winforms
我有一个由许多子控件组成的用户控件,我需要处理用户控件的双击事件.所以我添加了事件处理程序,但它从未被触发过.
我发现最快的解决方案是迭代子控件并订阅他们的双击事件.这真的是正确的方法吗?还有更好的方法吗?谢谢.
以下内容仅适用于添加到用户控件的第一级子控件.它不适用于随后添加到这些孩子的控件.例如,它可用于双击第一级Panel子控件,但不能用于Label添加到面板的控件.
test.cs中
public partial class Test : UserControl
{
public Test()
{
InitializeComponent();
}
protected override void OnControlAdded(ControlEventArgs e)
{
e.Control.DoubleClick += Control_DoubleClick;
base.OnControlAdded(e);
}
void Control_DoubleClick(object sender, EventArgs e)
{
MessageBox.Show("User control clicked");
OnDoubleClick(e);
}
}
Run Code Online (Sandbox Code Playgroud)
Form1.cs的
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var test = new Test();
var label = new Label();
label.Text = "test";
test.Controls.Add(label);
Controls.Add(test);
}
}
Run Code Online (Sandbox Code Playgroud)
要解决另一种情况,当您在控件中包含控件时,可以使用以下代码.在向其添加任何其他子控件之前,请务必将用户控件添加到其父控件.执行此操作后,请遵循与控制层次结构相同的原则.
更简单一点,在控件层次结构中的任何位置添加控件之前,请确保它的父级已添加到控件集合中.
test.cs中
protected override void OnControlAdded(ControlEventArgs e)
{
e.Control.DoubleClick += Control_DoubleClick;
e.Control.ControlAdded += OnControlAdded; // add this line
base.OnControlAdded(e);
}
// add this method
private void OnControlAdded(object sender, ControlEventArgs e)
{
e.Control.DoubleClick += Control_DoubleClick;
e.Control.ControlAdded += OnControlAdded;
}
Run Code Online (Sandbox Code Playgroud)
Form1.cs的
private void Form1_Load(object sender, EventArgs e)
{
var test = new Test();
var panel1 = new Panel();
panel1.BackColor = Color.AliceBlue;
var panel2 = new Panel();
panel2.BackColor = Color.AntiqueWhite;
var label1 = new Label();
label1.Text = "test 1";
label1.BackColor = Color.Aquamarine;
var label2 = new Label();
label2.Text = "test 2";
label2.BackColor = Color.Azure;
// !!! order is important !!!
// first add at least one child control to the test control
// this works as expected
//Controls.Add(test);
//test.Controls.Add(panel1);
//panel1.Controls.Add(panel2);
//panel2.Left = 50;
//panel1.Controls.Add(label1);
//panel2.Controls.Add(label2);
// this works as expected
//test.Controls.Add(panel1);
//Controls.Add(test);
//panel1.Controls.Add(panel2);
//panel2.Left = 50;
//panel1.Controls.Add(label1);
//panel2.Controls.Add(label2);
// this doesn't work for panel2 and it's children
Controls.Add(test);
panel1.Controls.Add(panel2); // panel2 & children will not trigger the events
// all controls added to control collections
// prior to this line will not trigger the event
test.Controls.Add(panel1);
panel2.Left = 50;
panel1.Controls.Add(label1);
panel2.Controls.Add(label2); // will not trigger the event
}
Run Code Online (Sandbox Code Playgroud)