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

おそらく、フォームコンストラクター内にTerminalクラスを作成します(InitializeComponenetの後)。
この時点で、フォームハンドルとコントロールのすべてのハンドルはフレームワークインフラストラクチャにのみ存在し、Windowsシステムには存在しないため、メッセージ(TextChanged)は発行されません。

Form_Loadイベント内にTerminalクラスを作成すると、RichTextBoxのTextChangedが問題なく呼び出されます。

于 2012-09-08T13:00:30.920 に答える