1. ホーム
  2. c#

シンプルカスタムイベント

2023-07-27 20:29:28

質問

私はカスタムイベントを学ぼうとしており、作成しようとしましたが、問題があるようです。

私はフォーム、静的クラス、カスタムイベントを作成しました。私が達成しようとしているのは、ボタンを押すと、フォームが静的クラスの関数を呼び出し、その関数が現在の状態を報告するために時々イベントを発生させるというものです。Form1 はイベントが発生したかどうかを聞き、発生した場合は、label1 のテキストを変更します。

今のところ、こんな感じです。

public partial class Form1 : Form
{
    public EventHandler<Progress> progress; 

    public Form1()
    {
        InitializeComponent();
        progress += SetStatus;
    }

    private void SetStatus(object sender, Progress e)
    {
        label1.Text = e.Status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

 }

ファイル2

class TestClass
{
    public static void Func()
    {
        //time consuming code
        Report status 
        // time consuming code
        report status
    }
}

public class Progress : EventArgs
{
    public string Status { get; private set; }

    private Progress() {}

    public Progress(string status)
    {
        Status = status;
    }
}

さて、ここでわからないのは、TestClassからどのようにイベントを発生させれば、Form1がイベントを処理し、label.Textを変更できるのか、ということです。

どのように解決するのですか?

これは、カスタムイベントを作成し、それを発生させる簡単な方法です。デリゲートを作成し、投げようとしているクラスでイベントを作成します。そして、あなたのコードの別の部分からイベントを購読します。あなたはすでにカスタムイベントの引数クラスを持っているので、それを基に他のイベントの引数クラスを作ることができます。注:私はこのコードをコンパイルしていません。

public partial class Form1 : Form
{
    private TestClass _testClass;
    public Form1()
    {
        InitializeComponent();
        _testClass = new TestClass();
        _testClass.OnUpdateStatus += new TestClass.StatusUpdateHandler(UpdateStatus);
    }

    private void UpdateStatus(object sender, ProgressEventArgs e)
    {
        SetStatus(e.Status);
    }

    private void SetStatus(string status)
    {
        label1.Text = status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

}

public class TestClass
{
    public delegate void StatusUpdateHandler(object sender, ProgressEventArgs e);
    public event StatusUpdateHandler OnUpdateStatus;

    public static void Func()
    {
        //time consuming code
        UpdateStatus(status);
        // time consuming code
        UpdateStatus(status);
    }

    private void UpdateStatus(string status)
    {
        // Make sure someone is listening to event
        if (OnUpdateStatus == null) return;

        ProgressEventArgs args = new ProgressEventArgs(status);
        OnUpdateStatus(this, args);
    }
}

public class ProgressEventArgs : EventArgs
{
    public string Status { get; private set; }

    public ProgressEventArgs(string status)
    {
        Status = status;
    }
}