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;
});
}
}
所以再一次,我没有看到任何错误,但文本框没有更新。我确信我没有做什么写,我只是对自定义事件的主题无知,我不知道如何解决这个问题。
您需要在运行代码之前订阅事件:
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));
}