ListView.SelectedIndexChangedイベントをプログラムで起動しますか?
-
03-07-2019 - |
質問
ListViewのSelectedIndexChangedイベントをプログラムで起動するにはどうすればよいですか
ユーザーが特定のアクションを完了した後、ListViewの最初のアイテムが自動的に選択されるようにしました。選択された項目を強調表示するコードは、SelectedIndexChangedイベント内に既に存在します。アイテムが強調表示されないだけでなく、SelectedIndexChanged内で設定されたブレークポイントにヒットすることもありません。さらに、Debug.WriteLineは出力の生成に失敗するため、イベントが発生していないことを確信しています。
次のコードはイベントの発生に失敗します。
listView.Items[0].Selected = false;
listView.Items[0].Selected = true;
listView.Select();
Application.DoEvents();
適切な測定のために、余分な.Select()メソッド呼び出しが含まれています。 ;)選択解除(.Selected = false)は、デフォルトで選択された可能性がある場合に備えて、.ItemsコレクションのListViewItemの選択を解除するために含まれていたため、「true」に設定しても効果がありません。 'Application.DoEvents()'呼び出しは、もう1つの最後の溝メソッドです。
上記のコードによってSelectedIndexChangedイベントが発生することはありませんか?
キーボードまたはマウス入力を介してアイテムが選択されると、SelectedIndexChangedイベントが適切に発生することに言及する必要があります。
解決
falseに設定して選択を解除してもイベントは発生しませんが、trueに設定すると発生します。
public Form1 ()
{
InitializeComponent();
listView1.Items[0].Selected = false; // Doesn't fire
listView1.Items[0].Selected = true; // Does fire.
}
private void listView1_SelectedIndexChanged (object sender, EventArgs e)
{
// code to run
}
何か他のことが起こっているかもしれません。選択コードを実行しているイベントは何ですか?
他のヒント
現在イベントハンドラーのメソッド内にあるコードを、元のスポットからもコードからも呼び出せるメソッドに移動できないのはなぜですか?
次のようなもの:
class Foo
{
void bar(Object o, EventArgs e)
{
// imagine this is something important
int x = 2;
}
void baz()
{
// you want to call bar() here ideally
}
}
これにリファクタリングされます:
class Foo
{
void bar(Object o, EventArgs e)
{
bop();
}
void baz()
{
bop();
}
void bop()
{
// imagine this is something important
int x = 2;
}
}
ListView
から派生したクラスを作成する場合、プロテクトメソッド OnSelectedIndexChanged
。これにより、 SelectedIndexChanged
イベントが発生します。