繁体   English   中英

在Click事件上获取UserControl

[英]Get UserControl on Click Event

我创建了一个自定义控件,其中包含panelslabels和图片pictureboxes 我试图在调用clicked事件时获取user controls name属性。

在我的用户控件中,我具有以下代码来使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的标签名称。

获得控件名称(例如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 ),并且应该是这样,这些细节不应传递给根窗体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM