0

我在这里的最后一个问题取得了一些进展:Event Text Postback from Multithreaded Class to 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...
}

我的 Windows 窗体:

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;
        });
    }
}

再说一次,我没有看到任何错误,但文本框根本没有更新。我确定我没有写任何东西,我只是对自定义事件的话题一无所知,我不知道如何解决这个问题。

4

2 回答 2

1

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

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));
}
于 2011-10-25T21:05:52.860 回答
1

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

private void NewScan(Object param) 
{ 
    Scan doScan = new Scan(); 
    doScan.Text += new Scan.TextHandler(SetText); 
    doScan.StarScan(Convert.ToInt32(checkBoxBulk.Checked)); 
}
于 2011-10-25T21:11:33.473 回答