選択範囲を変更せずに、ListBox で「アウトライン化」される項目を変更するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4611322

  •  26-09-2019
  •  | 
  •  

質問

ListBox で「アウトライン化」される項目を変更するにはどうすればよいですか? 明確にするために、次のスクリーンショットを参照してください。

Screenshot demonstrating what I mean by “outlined” item as opposed to “selected” item

背景: 正常に動作する標準の複数選択リストボックスが必要です。残念ながら、Windows フォームのリストボックス ( SelectionMode.MultiExtended) は完全には機能しません。欠けている機能は、Ctrl+矢印キーや Ctrl+Space を使用して、互いに素な項目のセットを選択できないことです。(Windows エクスプローラーで試して、どのように動作するかを確認してください。) ListBox をサブクラス化し、この不足している機能を追加しようとしています。この目的のために、私は Ctrl+Arrow キーに応答するつもりです。 OnKeyDown protected メソッドですが、そのためには、選択した項目のセットを変更せずにアウトラインを移動できる必要があります。それ、どうやったら出来るの?

役に立ちましたか?

解決

あなたはリストに LB_SETCARETINDEX のメッセージを送信することにより、これを行うことができます箱ます:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern uint SendMessage(IntPtr hWnd, uint msg, uint wParam, uint lParam);

public const uint LB_SETCARETINDEX = 0x019E;
public const uint LB_GETCARETINDEX = 0x019F;

[...]

public int OutlineIndex
{
    get
    {
        return (int) WinAPI.SendMessage(Handle, WinAPI.LB_GETCARETINDEX, 0, 0);
    }
    set
    {
        if (value < 0 || value >= Items.Count)
            throw new ArgumentException("OutlineIndex cannot be negative or greater than the size of the collection.", "value");
        WinAPI.SendMessage(Handle, WinAPI.LB_SETCARETINDEX, (uint) value, 0);

    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top