[英]Get UserControl on Click Event
我创建了一个自定义控件,其中包含panels
, labels
和图片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
)
实际上,这意味着在您的窗体上,您将永远不知道单击了哪个控件( Label
或PictureBox
),并且应该是这样,这些细节不应传递给根窗体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.