1

可能重复:
如何从函数调用事件处理程序?

我需要做一些我很确定应该很简单的事情,我有带有控件的表单,每个控件都有事件处理程序,可以设置正确格式的标签等
。我需要为特定类型的每个控件调用每个处理程序集合。我浏览了所有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”只能出现在左侧+=-=

有什么解决办法吗?

4

3 回答 3

2

您不能在声明事件的类之外引发事件(仅添加和删除处理程序可用)。与其尝试引发将调用事件处理程序的事件,不如简单地将处理程序逻辑提取到单独的方法中,然后调用该方法:

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

和处理程序:

void trackBar_Scroll(object sender, EventArgs e)
{
    DoSomething(((TrackBar)sender).Value);
}
于 2013-01-27T22:14:18.490 回答
0

出现错误是因为tb.Scrollis eventnot delegate

于 2013-01-27T22:15:48.170 回答
0

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

IE

像这样的东西:

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());
            }
        }
    }
}
于 2013-01-27T22:40:32.837 回答