2

好的,这对你们来说很容易,我基本上有一个 C# winform 应用程序,它只有一个 RichTextBox,还有一个名为 Terminal 的类,在那个类中有一个 RichTextBox 数据成员和其他一些东西,我通过了我的 RichTextBox形成终端的构造函数,如下所示:

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;
}

为什么会这样?为什么事件没有从方法内部触发?我怎么能开火?

谢谢。

4

1 回答 1

7

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

如果您在 Form_Load 事件中创建终端类,则将毫无问题地调用 RichTextBox 的 TextChanged。

于 2012-09-08T13:00:30.920 回答