【问题标题】:Custom Events in C#C# 中的自定义事件
【发布时间】:2011-10-25 20:37:21
【问题描述】:

我在这里的最后一个问题取得了一些进展: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;
        });
    }
}

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

【问题讨论】:

  • 您需要显示引发事件的代码...
  • 考虑使用EventHandler<TextArgs> 而不是您的自定义委托;这被认为是最佳实践。
  • @ReedCopsey 完成!感谢您指出这一点,这是漫长的一天,此刻我的大脑有些发烫。
  • 除非事件也在其他地方被触发,否则您遇到的问题是您在 StartScan 上触发事件后正在监听事件 (doScan.Text += ...)前一行

标签: c# .net winforms events custom-event


【解决方案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));
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多