【问题标题】:How to use "this" properly to access the form controls?如何正确使用“this”来访问表单控件?
【发布时间】:2009-06-23 10:28:15
【问题描述】:

在我的例子中,我有面板,但为了清楚起见,我将在我的示例中使用按钮。

我有 5 个(或更多)按钮,并且我为所有五个按钮设置了一个事件,例如 OnMouseHover。我如何获得,如果所有事件都链接到一个方法,则鼠标悬停在哪个按钮上

为了捕捉鼠标悬停的按钮,我尝试使用“this”,但它链接到表单本身。

    private void buttonX_MouseHover(object sender, EventArgs e)
    {
        this.Text = "Test";
    }

我希望鼠标悬停的指定按钮上的文本将其文本更改为“测试”,但它仅发生在表单上。文本。

在我的实际程序中,我有 60 个面板,我再次对其中任何一个上的所有 OnMouseHover 事件使用一种方法。如何获得鼠标悬停的面板(或上例中的按钮)?

【问题讨论】:

    标签: c# .net winforms events


    【解决方案1】:

    this 总是指类实例(表单)。您需要转换发件人:

    ((Control)sender).Text = "Test";
    

    发送者(通常)是引发事件的实例 - 在使用来自多个控件的相同处理程序时很有用。

    【讨论】:

    • 谢谢,你拯救了我的一天!我只有一个问题。是否所有事件中的“发送者”都与控件相关联?
    • @John:是的,它总是与引发事件的任何实例相关联——在控件的情况下,这就是当前控件。
    • 但是,当您自己引发事件时,您需要确保手动传递适当的实例 (this),因为编译器无法确保这一点。我想这就是马克在他的回答中所说的“一般”的意思。
    • 没错。如果您进行事件填充,情况也是如此:“public event EventHandler SomeEvent {add {innerControl.SomeEvent += value;} remove {innerControl.SomeEvent -= value;}} - 这里,发送者是 innerControl,而不是外部控制...要正确处理,您需要使用不同的发件人处理并重新引发事件。
    【解决方案2】:

    这始终是类,在这种情况下是表单本身。对象“发送者”是魔术词。如果它是一个按钮,则将其转换回一个按钮。由于该对象只是一个引用,您可以对发送对象进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多