c#中的自定义事件

本文关键字:事件 自定义 | 更新日期: 2023-09-27 18:12:28

我已经从我的最后一个问题取得了一些进展:从多线程类到Windows ActiveForm的事件文本回发

我也取得了一些进展:http://www.codeproject.com/KB/cs/simplesteventexample.aspx

但是我又卡住了,代码似乎没有触发事件或正确处理它(我真的是新的自定义事件)。

这是我目前的代码。

public class TextArgs : EventArgs
{
    private string CurrentText;
    public string Text
    {
        set
        {
            CurrentText = value;
        }
        get
        {
            return this.CurrentText;
        }
    }
}
class Scan
{
    public event TextHandler Text;
    public delegate void TextHandler(Scan s, TextArgs e);
    private void ProcessDirectory(String targetDirectory, DateTime cs)
    {
        SetScanHistory(targetDirectory);
        // Does a bunch of stuff...
    }
    // EDIT: Forgot this bit of code; thanks for pointing this out :)
    // Sets the text of scan history in the ui
    private void SetScanHistory(string text)
    {
        if (Text != null)
        {
            TextArgs TH = new TextArgs();
            TH.Text = text;
            Text(this, TH);
        }
    }
    // Does more stuff...
}

My Windows Form:

public partial class MyWinForm: Form
{
    private void NewScan(Object param)
    {
        Scan doScan = new Scan();
        doScan.StarScan(Convert.ToInt32(checkBoxBulk.Checked));
        doScan.Text += new Scan.TextHandler(SetText);
    }
    // Sets the text of txtScanHistory to the text 
    private void SetText(Scan s, TextArgs e)
    {
        // Invoke is always required (which is intended)
        this.Invoke((MethodInvoker)delegate
        {
            txtScanHistory.Text += e.Text + Environment.NewLine;
        });
    }
}

所以再一次,我没有看到任何错误,但文本框没有更新。我确信我没有做什么写,我只是对自定义事件的主题无知,我不知道如何解决这个问题。

c#中的自定义事件

您需要在运行代码之前订阅事件:

private void NewScan(Object param)
{
    Scan doScan = new Scan();
    // Change the order so you subscribe first!
    doScan.Text += new Scan.TextHandler(SetText);
    doScan.StarScan(Convert.ToInt32(checkBoxBulk.Checked));
}

您的代码是正确的,除了一个微小但非常重要的细节。在期望监视的代码执行之后,您正在订阅事件处理程序。在注册事件处理程序后,更改方法NewScan以调用StarScan:

private void NewScan(Object param) 
{ 
    Scan doScan = new Scan(); 
    doScan.Text += new Scan.TextHandler(SetText); 
    doScan.StarScan(Convert.ToInt32(checkBoxBulk.Checked)); 
}