1

右クリックでリストビューのアイテムがクリックとダブルクリックの両方で選択されないようにするにはどうすればよいですか?

4

3 に答える 3

2

あなたはこのコードを使うことができます、私はそれが仕事をするべきだと思います。右クリックが原因でSelectedIndexChangedイベントハンドラーが起動した場合boolは、右マウスがクリックされMouseDown、次に選択されたアイテムがクリックされたことを示す変数を設定してから、イベントのインジケーターをリセットする必要があります。コードを確認してください:ClearMouseUp

bool rightClicked = false;
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
    {
        rightClicked = true;
    }
    else
    {
        rightClicked = false;
    }
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (rightClicked)
    {
        listView1.SelectedItems.Clear();
    }

}

private void listView1_MouseUp(object sender, MouseEventArgs e)
{
    rightClicked = false;
}

編集:これは私ができる最善のことです、それは選択を保持しますがちらつきます。ソリューションは、アイテムのカスタム描画を使用して実装できますが、時間がかかりすぎます。それはあなたにお任せします。

bool rightClicked = false;
int [] lviListIndex = null;
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
      if (e.Button == System.Windows.Forms.MouseButtons.Right)
      {
            rightClicked = true;
            lviListIndex = new int[listView1.SelectedItems.Count];
            listView1.SelectedIndices.CopyTo(lviListIndex, 0);
      }
      else
      {
            rightClicked = false;
      }
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
      if (rightClicked)
      {
            listView1.SelectedIndices.Clear();   
      }
}

private void listView1_MouseUp(object sender, MouseEventArgs e)
{
      if (rightClicked)
      {
            listView1.SelectedIndexChanged -= new System.EventHandler(listView1_SelectedIndexChanged);
            if (lviListIndex != null)
            {
                 foreach (int index in lviListIndex)
                 {
                      listView1.SelectedIndices.Add(index);
                 }
            }
            lviListIndex = null;
            listView1.SelectedIndexChanged += new System.EventHandler(listView1_SelectedIndexChanged);
      }
      rightClicked = false;
}
于 2012-11-29T12:15:01.877 に答える
1

リストビューをサブクラス化し、このオーバーライドを追加します。

protected override void WndProc(ref Message m)
        {
            const int WM_RBUTTONUP = 0x0205;
            const int WM_RBUTTONDOWN = 0x0204;

            if ((m.Msg != WM_RBUTTONDOWN) && (m.Msg != WM_RBUTTONUP))
            {
                base.WndProc(ref m);
            }
        }

これは、マウスの右ボタンからのメッセージを無視することで機能します。

于 2014-04-15T22:17:51.543 に答える
-1

このように確認できます if (e.Button == MouseButtons.Left)

于 2012-11-29T11:54:54.727 に答える