好的,这个对你们来说很容易,我基本上有一个C#winform应用程序,它只有一个RichTextBox,并且有一个名为Terminal的类,在那个类里面有一个RichTextBox数据memeber和其他一些东西,我通过了我的表单的RichTextBox到Terminal的构造函数,如下所示:
public Terminal(RichTextBox terminalWindow)
{
this.terminalWindow = terminalWindow;
CommandsBuffer = new List<string>();
currentDirectory = homeDirectory;
this.terminalWindow.TextChanged += new EventHandler(terminalWindow_TextChanged);
InsertCurrentDirectory();
}
这就是我在InsertCurrentDirectory()方法中所做的:
private void InsertCurrentDirectory()
{
terminalWindow.Text = terminalWindow.Text.Insert(0, currentDirectory);
terminalWindow.Text = terminalWindow.Text.Insert(terminalTextLength, ":");
terminalWindow.SelectionStart = terminalTextLength + 1;
}
正如您所看到的,我在调用此方法之前已经注册了该事件,但问题是,即使我正在从此方法内部更改文本,事件仍未触发。 但是当我在注册事件后立即更改构造函数中的文本时,它实际上被解雇了,例如:
public Terminal(RichTextBox terminalWindow)
{
// ...
this.terminalWindow.TextChanged += new EventHandler(terminalWindow_TextChanged);
this.terminalWindow.Text = "the event fired here";
}
这是TextChanged事件,以防您想知道其中包含的内容:
void terminalWindow_TextChanged(object sender, EventArgs e)
{
terminalTextLength = terminalWindow.Text.Length;
}
为什么会这样?为什么事件没有从方法内部触发?我怎么解雇它?
感谢。
答案 0 :(得分:7)
可能你在表单构造函数中创建了Terminal类(在InitializeComponenet之后) 此时,表单句柄和控件的所有句柄仅存在于框架基础结构中,而不存在于Windows系统中,因此不会触发任何消息(TextChanged)。
如果在Form_Load事件中创建Terminal类,则会毫无问题地调用RichTextBox的TextChanged。