由于标签在顶部,因此我无法激活事件鼠标的输入。我尝试分配相同的事件,但是当我调用MyUserControl myUserControl =(MyUserControl)sender时;导致错误。这是我的代码:
foreach (Control ctrl in MyUserControl.Controls)
{
ctrl.MouseEnter += MyUserControl_MouseEnter;
}
private void MyUserControl_MouseEnter(object sender, EventArgs e)
{
MyUserControl myUC = (MyUserControl)sender;
int test = myUC .Codigo;
}
事件(Form_MouseEnter)在表单中发生时起作用,但在组件中它返回诸如'System.InvalidCastException'的错误
public partial class MyUserControl : UserControl
{
int g_intCodEquip;
public int Codigo
{
set { g_intCodEquip = value; }
get { return g_intCodEquip; }
}
}
为了确保正确处理MyUserControl的所有子控件,我们可以迭代MyUserControl的控件树并订阅MouseEnter事件。
我们将所有这些事件路由到集中式Any_MouseEnter处理程序,该处理程序又触发Form1订阅的新自定义事件:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
IterateControlTree();
}
void IterateControlTree(Control control = null)
{
if (control == null)
{
control = this;
}
control.MouseEnter += Any_MouseEnter;
foreach (Control child in control.Controls)
{
IterateControlTree(child);
}
}
private void Any_MouseEnter(object sender, EventArgs e)
{
// Before calling Invoke we need to make sure that
// MyUserControlMouseEnter is not null as would be
// the case if there are no subscribers to the event.
// The '?' syntax performs this important check.
MyUserControlMouseEnter?.Invoke(this, EventArgs.Empty);
}
// A custom event that this custom control can fire.
public event EventHandler MyUserControlMouseEnter;
public int Codigo
{
set
{
test = value;
}
get
{
return test;
}
}
int test = 0;
}
注意:这是您上一篇文章的后续问题,因此我在“ Codigo”属性上进行了复制。
好,现在在主Form1中,我们订阅MyUserControl触发的新事件。现在,发送者的类型为MyUserControl,强制转换成功,并且无论鼠标进入哪个控件,通知都有效。
private void MyUserControl_MouseEnter(object sender, EventArgs e)
{
MyUserControl myUserControl = (MyUserControl)sender;
Debug.WriteLine(
"MouseEnter Detected: " + myUserControl.Name +
" - Value of Codigo is: " + myUserControl.Codigo);
}
作为测试跑步者,我们可以设置4 x 3的MyUserControl数组(工作示例MyUserControl包含一个Label和一个Button)。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
TableLayoutPanel tableLayoutPanel1 = new TableLayoutPanel() { ColumnCount = 4, RowCount = 4, Dock = DockStyle.Fill };
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
Controls.Add(tableLayoutPanel1);
int row, column;
for (int count = 0; count < 12; count++)
{
row = count / 4; column = count % 4;
MyUserControl myUserControl = new MyUserControl();
myUserControl.Name = "MyUserControl_" + count.ToString("D2"); // Name it! (Default is "")
// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Subscribe to custom event fired by MyUserControl
myUserControl.MyUserControlMouseEnter += MyUserControl_MouseEnter;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
myUserControl.Codigo = 1000 + count; // Example to set Codigo
tableLayoutPanel1.Controls.Add(myUserControl, column, row);
}
}
}
该行为遵循此10秒剪辑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句