我创建了一个自定义控件,其中包含panels
,labels
和pictureboxes
。我正在尝试获取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
的标签名称。
答案 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
)
这实际上意味着在表单上,您将永远不知道单击了哪个控件(Label
或PictureBox
),这就是应该的方式,不应单击这些详细信息传递给根表单。