2

Windows アプリケーションにリストビュー コントロールがあり、いくつかのアイテム セットが取り込まれています。ListViewItem.Selectedプロパティを trueに設定して、プログラムでアイテムを選択します。しかし、ユーザーがリストビューで項目を選択できないようにしたいです。つまり、常にプログラムで選択する必要があります。コントロールを無効にすることでユーザーの選択を防ぐことができますが、コントロールを無効にするとスクロール バーも無効になり、正しくありません。

カスタム リストビュー コントロールを作成し、ItemSelectionChangingWndProc 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 によると、項目が強調表示されているが実際には選択されていないときにイベントをトリガーする方法はありますか?

4

3 に答える 3

1
public FrmTest()
{
    list.ItemSelectionChanged += list_ItemSelectionChanged;
}

private bool changing;

private void list_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
    if (changing)
        return;

    if (e.Item == nonSelectableListItem) 
    {
        changing = true;
        nonSelectableListItem.Selected = false;
        changing = false;
    }
}

サンプル:

ここに画像の説明を入力

于 2015-11-11T12:02:53.677 に答える
0

簡単な解決策は、プログラムで選択を変更していることを示すフラグを保持し、イベントを通過させ、完了したらフラグをリセットすることです。

編集:あなただけが選択を変更でき、これをプログラムで行う場合、これがいつどこで発生するかを制御できるのに、なぜ必要なのEventHandlerですか?メソッドを呼び出して、実行したい処理を実行してみませんか?

于 2012-11-27T14:02:19.383 に答える
0

これを行う汚い方法の 1 つは、選択した項目のリストを保持し、コード以外の方法で変更されるたびに選択を更新することです。

また、選択状態が変更されたアイテムごとに個別に発生するItemSelectionChangedイベントもあります。おそらく、このイベントで選択状態を元に戻すことができます。

また、Better ListView Expressコントロールもご覧ください。ユーザーが選択を変更できないように、読み取り専用モードがあります。そのセットアップは非常に簡単です。

listView.ReadOnly = true;

フルバージョンでは、カスタムの選択不可アイテムもサポートされています。単純な設定:

listView.Items[0].Selectable = false;

最初のものを (ユーザーが) 選択できないようにします。

もちろん、コードから項目を選択することもできます。

次の画像は、動作中の選択できない項目を示しています (それらは灰色でマークされています)。

ここに画像の説明を入力

于 2012-12-01T20:08:22.350 に答える