2

テキストボックスに SelectionStart プロパティと SelectionLength プロパティを使用しようとしています。効果はありませんが、エラーもありません。これは実際にはバックグラウンド ワーカーの ProgressChanged メソッドの一部ですが、テスト ソリューションで SelectionStart と SelectionLength を分離して試してみましたが、同じです..何も起こりません..

何か案は?ありがとう!!!

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{
    // Update the GUI as the music is playing
    textBox1.SelectionStart = ((int)e.UserState);
    textBox1.SelectionLength = (1);
}
4

2 に答える 2

5

ReportProgressあなたのコードは私にとっては問題なく動作します(あなたのBGWが開始され、もちろんあなたが呼び出していると仮定しています)。

ここでの私の推測では、コードも機能していると思いますが、おそらくTextBoxにフォーカスがないため、選択したテキストを表示できません。

これが問題である場合は、TextBoxのHideSelectionプロパティをfalseに設定してください。これにより、TextBoxにフォーカスがない場合でも、TextBoxの選択されたテキストが選択された(強調表示された)表示になります。

TextBoxのSelectedTextプロパティをクエリして、コントロールで選択されたテキストが表示されていない場合でも、そのテキストを取得することもできます。

于 2012-06-21T20:08:28.930 に答える
1

オブジェクトを作成したのと同じスレッド (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() してください。テキストの選択範囲が意図したとおりに設定されている可能性がありますが、ボックスにフォーカスがないため表示されません。

于 2012-06-21T19:55:35.153 に答える