【问题标题】:Is it possible to call this event handler in this case? [duplicate]在这种情况下是否可以调用此事件处理程序? [复制]
【发布时间】:2021-01-31 17:13:17
【问题描述】:

我在 WinForms 中使用 C# 来使用轨迹栏,如下所示。在代码的开头我定义了事件处理程序:

this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll); 

这是滚动轨迹栏时的实现:

private void trackBar1_Scroll(object sender, EventArgs e)
{
    //do something...
}

所以这行得通,但我需要从另一个事件处理程序内部调用上述函数,例如:

public void numericUpDown1_TextChanged(object sender, EventArgs e)
{
    //what to do here to call trackBar1_Scroll ?
}

如何从 numericUpDown1_TextChanged 内部调用 trackBar1_Scroll?

【问题讨论】:

  • 您想要类似:trackBar1_Scroll(trackBar1, EventArgs.Empty)trackBar1_Scroll(numericUpDown1, EventArgs.Empty)trackBar1_Scroll(null, null) 吗?
  • trackBar1_Scroll(null, null) 就足够了
  • @Steve 那没用。我已经试过了。它移动轨迹栏,但不调用 trackBar1_Scroll。
  • 是检查。但是如何编写一个可从 Scroll 事件和 TextChanged 事件调用的通用方法呢?
  • @Steve 你的意思是添加到 this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll); ?我实际上不知道如何实现它以从两者调用。

标签: c# .net winforms event-handling


【解决方案1】:

您通常不需要sendere 参数。因此只需创建一个无参数方法

private void DoSomething() // Hopefully with a better name
{
    // do things ...
}

然后在您的事件处理程序中调用它。

private void trackBar1_Scroll(object sender, EventArgs e)
{
    DoSomething();
}

public void numericUpDown1_TextChanged(object sender, EventArgs e)
{
    DoSomething();
}

如果你给方法一个描述性的名字,你的代码会变得更容易阅读。但当然你也可以只调用另一个事件处理程序。事件处理程序毕竟只是一个方法

public void numericUpDown1_TextChanged(object sender, EventArgs e)
{
    trackBar1_ValueChanged(sender, e);
}

由于这两个事件处理程序具有相同的签名(相同的参数列表和返回类型),您可以声明一个并将其附加到两个控件:

void HandleUpdates(object sender, EventArgs e)
{
    // do things...
}

并分配给它

trackBar1.Scroll += HandleUpdates; 
numericUpDown1.TextChanged += HandleUpdates; 

您也可以在事件选项卡的属性窗口中分配它。 new System.EventHandler(...) 不是必需的。 C# 会自动为您完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多