在Click事件上获取UserControl

时间:2019-05-06 19:21:17

标签: c# vb.net visual-studio

我创建了一个自定义控件,其中包含panelslabelspictureboxes。我正在尝试获取user controls名称的属性,该事件的点击事件被调用。

在用户控件中,我具有以下代码来使click事件冒泡,以便任何子控件都可以触发click事件

    private void reclusiveControlLoop(ControlCollection Controls, EventHandler EventValue, Boolean Mode)
    {
        foreach (Control control in Controls)
        {
            if (control.Controls.Count > 0)
            {
                reclusiveControlLoop(control.Controls, EventValue, Mode);
            }

            if (Mode)
            {
                control.Click += EventValue;
            }
            else
            {
                control.Click -= EventValue;
            }
        }
    }

    public new event EventHandler Click
    {
        add
        {
            base.Click += value;
            reclusiveControlLoop(pnlContent.Controls, value, true);
        }
        remove
        {
            base.Click -= value;
            reclusiveControlLoop(pnlContent.Controls, value, false);
        }
    }

在具有用户控件的表单上,我添加了以下代码

Private Sub ListLinkLaunch_Click(sender As Object, e As EventArgs) Handles llCommissions.Click
        Try
            Dim llItem As Control = CType(sender, Control)
            Dim sName As String = llItem.Name.ToString()

            MessageBox.Show(sName)

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

问题在于它不是返回我添加的控件的名称llCommissions,而是返回用户控件lblListLinkTitle的标签名称。

1 个答案:

答案 0 :(得分:1)

获得控件名称(例如lblListLinkTitle的原因,与将Click事件分配给每个控件的方式有关。正如您的代码所示,每个控件都将引发Click事件,直到引发包含表单为止。

要获得所需的行为,每个控件都应将其Click事件引发到您的自定义控件,然后从那里引发一个新事件到包含表单。

为了使其能够按需工作,请进行以下更改:

在UserControl.cs内部-调用InitializeComponent之后的构造方法

pnlContent.Click += AllControls_Click;
reclusiveControlLoop(pnlContent.Controls, true);

而且,这是您修改后的其余代码,使其工作方式略有不同。

private void AllControls_Click(object sender, EventArgs e)
{
    base.OnClick(e);
}

private void reclusiveControlLoop(ControlCollection Controls, Boolean Mode)
{
    foreach (Control control in Controls)
    {
        if(control.Controls.Count > 0)
        {
            reclusiveControlLoop(control.Controls, Mode);
        }

        if(Mode)
        {
            control.Click += AllControls_Click;
        }
        else
        {
            control.Click -= AllControls_Click;
        }
    }
}

使用此方法,您不再需要定义新的Click EventHandler(public new event EventHandler Click

这实际上意味着在表单上,​​您将永远不知道单击了哪个控件(LabelPictureBox),这就是应该的方式,不应单击这些详细信息传递给根表单。