1

重複の可能性:
関数からイベント ハンドラーを呼び出すにはどうすればよいですか?

私は単純であると確信していた何かをする必要があります。フォームにはコントロールがあり、すべてのコントロールには正しいフォーマットでラベルを設定するイベントハンドラーがあります。
必要なのは、特定のタイプのすべてのコントロールのすべてのハンドラーコレクションを呼び出すことです。すべてのスタックオーバーフローを参照しましたが、結果は表示されませんでした。

単純なアプリケーションですので、「イベント ハンドラから呼び出される追加関数が必要です」などのコメントはやめてください。

これは私が試したものです

 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

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

tb.Scrollではeventないため、エラーが表示されdelegateます。

于 2013-01-27T22:15:48.170 に答える