当文本从方法内部更改时,RichTextBox.TextChanged事件不会触发

时间:2012-09-08 12:44:27

标签: c# events

好的,这个对你们来说很容易,我基本上有一个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;
}

为什么会这样?为什么事件没有从方法内部触发?我怎么解雇它?

感谢。

1 个答案:

答案 0 :(得分:7)

可能你在表单构造函数中创建了Terminal类(在InitializeComponenet之后) 此时,表单句柄和控件的所有句柄仅存在于框架基础结构中,而不存在于Windows系统中,因此不会触发任何消息(TextChanged)。

如果在Form_Load事件中创建Terminal类,则会毫无问题地调用RichTextBox的TextChanged。