如何调用添加到控件的事件处理程序方法?

时间:2013-01-27 22:09:32

标签: c# winforms

  

可能重复:
  How can I invoke an event handler from a function?

我需要做一些我非常确定应该简单的事情,我有Form控件,每个控件都有事件处理程序,用于设置正确格式化的标签等。
我需要的是为特定类型的每个控件调用每个处理程序集合。 我浏览了所有stackoverflow,从未看过结果。

这是简单的应用程序,所以请停止评论:“你需要从事件处理程序调用的其他函数”。

这就是我试过的

 foreach (Control ctrl in Controls)
 {
     if (ctrl is TrackBar)
     {
        TrackBar tb = ctrl as TrackBar;
        Invoke(tb.Scroll, tb, new EventArgs());
     }
 }

但我看到很奇怪的错误

  

事件'System.Windows.Forms.TrackBar.Scroll'只能显示在+=-=

的左侧

任何解决方案?

3 个答案:

答案 0 :(得分:2)

您不能在声明事件的类之外引发事件(仅添加和删除处理程序)。而不是尝试引发将调用事件处理程序的事件,只需将处理程序逻辑提取到单独的方法,并调用该方法:

foreach (TrackBar tb in Controls.OfType<TrackBar>())
{
    DoSomething(tb.Value);
}

和处理程序:

void trackBar_Scroll(object sender, EventArgs e)
{
    DoSomething(((TrackBar)sender).Value);
}

答案 1 :(得分:0)

出现

错误是因为tb.Scroll event不是delegate

答案 2 :(得分:0)

您可以尝试使用与事件相同的delegate创建Signature,为您的控件创建一个公共事件处理程序,然后您可以调用它或正常响应事件。

这样的事情:

public partial class Form1 : Form
{
    public delegate void  trackbarscroll( object sender, EventArgs e);
    trackbarscroll tbs; 
    public Form1()
    {
        InitializeComponent();
        trackBar1.Scroll += new EventHandler(trackBar_Scroll);
        trackBar2.Scroll += new EventHandler(trackBar_Scroll);
        tbs = trackBar_Scroll; 
    }

    void trackBar_Scroll(object sender, EventArgs e)
    {
        TrackBar tb = (TrackBar)sender;


    }

    private void button1_Click(object sender, EventArgs e)
    {
        foreach (Control ctrl in Controls)
        {
            if (ctrl is TrackBar)
            {
                TrackBar tb = ctrl as TrackBar;
                Invoke(tbs,tb, new EventArgs());
            }
        }
    }
}