【问题标题】:Which UserControl's calling Event MouseEnter?哪个用户控件调用事件 MouseEnter?
【发布时间】:2020-06-02 12:32:30
【问题描述】:

我有一个UserControl 的列表,我想知道哪个UserControl 正在调用事件MouseEnter。我在TableLayoutPanel 上添加了多个UserControls。

List<MyUserControl> form = new List<MyUserControl>();

for (int x = 0; x < dt.Rows.Count; x++)
{
    tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 200));
    if (x == 0)
       tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    form.Add(new MyUserControl());
}

for (int x = 0; x < form.Count; x++)
{    
    form[x].MouseEnter += new EventHandler(Form_MouseEnter);
    tableLayoutPanel1.Controls.Add(form[x], x, 0);
}

如何找出是哪个UserControl 激活了该事件?

【问题讨论】:

  • 您能否向我们展示您的 this.Form_MouseEnter 事件处理程序代码?
  • (object sender, System.EventArgs e) 应该是您的事件参数,对吧? sender 是你的 UserControl
  • Form_MouseEnter 实际上是空的,我需要从 MyUserControl 获取这个: public int Codigo { set { test = value; } 得到 { 返回测试; } }
  • Form_MouseEnter 实际上是空的, 那么当鼠标进入任何一个 UC 时,什么都不做。把MyUserControl enteredUC = sender as MyUserControl;

标签: c# winforms user-controls


【解决方案1】:

最大的不同是如果你给你的新 MyUserControl 一个名称,因为默认名称是一个空字符串。你能试着把你的代码改成这个,看看有没有帮助?

List<MyUserControl> form = new List<MyUserControl>();

for (int x = 0; x < 5; x++)
{
    tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 200));
    if (x == 0)
        tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));

    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    // Here are the changes
    MyUserControl myUserControl = new MyUserControl();
    myUserControl.Name = "MyUserControl_" + x.ToString("D2"); // Name it! (Default is "")                
    myUserControl.MouseEnter += MyUserControl_MouseEnter;     // Hook the MouseEnter here
    myUserControl.Codigo = 1000 + x;                          // Example to set Codigo     
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    form.Add(myUserControl); // NOTE! This is changed from 'new MyUserControl()'.
}

for (int x = 0; x < form.Count; x++)
{
    tableLayoutPanel1.Controls.Add(form[x], x, 0);
}

现在处理程序看起来像这样:

private void MyUserControl_MouseEnter(object sender, EventArgs e)
{
    MyUserControl myUserControl = (MyUserControl)sender;
    Debug.WriteLine(
        "MouseEnter Detected: " + myUserControl.Name + 
        " - Value of Codigo is: " + myUserControl.Codigo);
}

...哪里(根据您对 Codigo 的评论)...

class MyUserControl : UserControl
{
    public int Codigo 
    { 
        set 
        { 
            test = value; 
        } 
        get 
        { 
            return test; 
        } 
    }
    int test = 0;
    // Of course there is more implementation of MyUserControl that follows...
}

我真的希望这可以帮助您解决您遇到的问题。

【讨论】:

  • 感谢您的回答,它有帮助.. 但我还有另一个问题,我无法激活事件鼠标输入,因为标签在顶部。我尝试分配相同的事件,但是当我调用 MyUserControl myUserControl = (MyUserControl)sender;导致错误...我真的需要返回 Codigo...还有其他方法吗?
  • 好的,所以当我在回答您的问题时,我编写了自己的代码以确保它能够正常工作,并且我还在 GitHub 上创建了一个公共存储库。如果一个工作示例对您有帮助,您可以找到它here
  • 谢谢!!我仍然没有这样做的声誉:(我现在会看到你的例子
  • 请看this video。这是你想做的事情吗?我是否正确理解了您的目标?
  • 我看过视频,就是这样,但是想象一个顶部有dock fill的标签,当你进入时,事件将通过标签而不是通过用户控件
【解决方案2】:

see in docmation

this.panel1.MouseEnter += new System.EventHandler(this.panel1_MouseEnter);

使用sender

private void panel1_MouseEnter(object sender, System.EventArgs e) 
{
    var userControl = sender as MyUserControl
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多