オブジェクトを作成したのと同じスレッド (GuiThread) でこのコードを実行している場合は、必ず確認してください。バックグラウンド ワーカーは、テキスト ボックスが作成されたスレッドと同じスレッドではない可能性があります。コントロールで Invoke を呼び出すことにより、GuiThread を使用していることを確認できます (これは "this" で参照できます)。
だから..次のようなことをしてください
this.Invoke()。
デリゲートを渡す必要があるため、テキスト ボックスの選択ロジックを別のメソッドに移動し、そのメソッドを Invoke() 呼び出しに渡します。
編集:
コードはおそらく次のようになります。
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.Invoke(new Action<TextBox, int, int>(UpdateTextboxSelection), new object[] { textBox1, (int)e.UserState, 1 });
}
private void UpdateTextboxSelection(TextBox t, int start, int length)
{
t.SelectionStart = start;
t.SelectionLength = length;
t.Focus(); // to make sure the box is in focus so that you see the selection
}
編集 2: 注、実際にこれが機能するかどうかを確認しようとはしていません。これは、特定の UI が何もしない理由を疑問に思ったときに常に発生する一般的な問題です。別のスレッドで実行していることに気付き、機能するGUIスレッドの使用を開始します。
編集 3: テストを実行しました。完了したら、必ずテキストボックスに Focus() してください。テキストの選択範囲が意図したとおりに設定されている可能性がありますが、ボックスにフォーカスがないため表示されません。