Windows アプリケーションにリストビュー コントロールがあり、いくつかのアイテム セットが取り込まれています。ListViewItem.Selected
プロパティを trueに設定して、プログラムでアイテムを選択します。しかし、ユーザーがリストビューで項目を選択できないようにしたいです。つまり、常にプログラムで選択する必要があります。コントロールを無効にすることでユーザーの選択を防ぐことができますが、コントロールを無効にするとスクロール バーも無効になり、正しくありません。
カスタム リストビュー コントロールを作成し、ItemSelectionChanging
WndProc check linkを使用してイベント ハンドラーを実装したとしても、以下に示すようにイベントをキャンセルできます。
private void lstLiveTables_ItemSelectionChanging(object sender, ListViewExItemSelectionChangingEventArgs e)
{
e.Cancel = true;
}
ただし、プログラムで選択されたアイテムであっても、これによりイベントがキャンセルされます。私の質問は、選択が手動で(ユーザーによって)行われたのか、メッセージ内SelectedIndexChanged
またはWndProc
メッセージを使用してプログラムで行われたのかを特定する方法があります。
注: 必要に応じて、CustomListView コントロールのコードをアップロードします。
更新 1
ありがとうエマーテル。いい考えでした。アイテムを選択する前にのみイベントにサブスクライブし、選択した直後に削除して、同じことを達成しようとしました。このようにして、選択するとすぐにイベントがトリガーされ、続行されます。これはうまくいっています。
this.lstTables.SelectedIndexChanged += new System.EventHandler(this.lstTables_SelectedIndexChanged);
item.Selected = true;
this.lstTables.SelectedIndexChanged -= new System.EventHandler(this.lstTables_SelectedIndexChanged);
しかし、ユーザーがアイテムを手動で選択すると、何も起こらず (イベントはトリガーされません)、アイテムだけが強調表示されるという問題があります。項目が強調表示され、同じ項目をプログラムで選択しようとしても、何も起こらない。つまり、SelectedIndexChanged
その項目が既に強調表示されているため、その項目に対してイベントがトリガーされない。
注:あなたが提案したフラグアプローチに従っても、同じ動作です。
更新 2
emartel の提案としてイベントを処理する代わりに、独自のメソッドを使用することで、この問題を解決できます。SelectedIndexChanged
しかし、私の質問は、更新 1 によると、項目が強調表示されているが実際には選択されていないときにイベントをトリガーする方法はありますか?