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

C# 当文本从方法内部更改时,RichTextBox.TextChanged事件不触发,c#,events,C#,Events,好的,这个对你们来说很简单,我基本上有一个C#winform应用程序,它只有一个RichTextBox,还有一个叫做Terminal的类,在这个类中有一个RichTextBox数据memeber和其他一些东西,我将我表单的RichTextBox传递给Terminal的构造函数,如下所示: public Terminal(RichTextBox terminalWindow) { this.terminalWindow = terminalWindow; CommandsBuffer =

好的,这个对你们来说很简单,我基本上有一个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();
}
如您所见,我在调用此方法之前已注册了事件,但问题是,即使我正在更改此方法中的文本,事件也不会触发。 但当我在注册事件后立即更改构造函数中的文本时,它实际上触发了,例如:

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;
}
为什么会这样?为什么事件没有从方法内部触发?我怎样才能发射它


谢谢。

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


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

哇,谢谢它成功了,我甚至没想到会这样想!SelectionStart属性分配是重要的,它强制创建本机窗口。
void terminalWindow_TextChanged(object sender, EventArgs e)
{
  terminalTextLength = terminalWindow.Text.Length;
}