处理具有许多子控件的用户控件的双击事件

3 .net c# events user-controls winforms

我有一个由许多子控件组成的用户控件,我需要处理用户控件的双击事件.所以我添加了事件处理程序,但它从未被触发过.

我发现最快的解决方案是迭代子控件并订阅他们的双击事件.这真的是正确的方法吗?还有更好的方法吗?谢谢.

Ale*_*ici 6

以下内容仅适用于添加到用户控件的第一级子控件.它不适用于随后添加到这些孩子的控件.例如,它可用于双击第一级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)