Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅使用鼠标左键选择ListViewItem?_C#_Winforms_Listview - Fatal编程技术网

C# 如何仅使用鼠标左键选择ListViewItem?

C# 如何仅使用鼠标左键选择ListViewItem?,c#,winforms,listview,C#,Winforms,Listview,如何防止右键单击在我的列表视图中选择一个项目,包括单击和双击?如果(e.Button==MouseButtons.Left)您可以使用此代码,我认为它应该可以完成这项工作。您需要设置一些bool变量,以指示在MouseDown中已单击鼠标右键,然后清除所选项目(如果选择了因右键单击而触发的DexChanged事件处理程序),然后在MouseUp事件上重置指示器。检查代码: bool rightClicked = false; private void listView1_MouseDown(ob

如何防止右键单击在我的列表视图中选择一个项目,包括单击和双击?

如果(e.Button==MouseButtons.Left)您可以使用此代码,我认为它应该可以完成这项工作。您需要设置一些
bool
变量,以指示在
MouseDown
中已单击鼠标右键,然后
清除所选项目(如果选择了因右键单击而触发的DexChanged事件处理程序),然后在
MouseUp
事件上重置指示器。检查代码:

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;
}

子类化listview并添加此覆盖:

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);
            }
        }

这是通过忽略鼠标右键发出的消息来实现的。

谢谢Ravindra,但你的意思是在哪种情况下?@SaraSaeed:在鼠标向上事件中谢谢Nikola,但这不会取消鼠标左键的任何选择吗?我想我们可以在更改选择之前替换此代码,如果右键单击=false,则取消选择我不明白是什么正是你的意思。你能说得更具体些吗?你试过密码了吗?如果我有一个包含四个项目的列表视图,那么我用鼠标左键选择第一个项目,然后用鼠标右键单击第二个项目,选择就会消失。我想保持第一个项目处于选中状态,只要我没有用左键选择任何其他项目button@SaraSaeed好的,我明白了,那需要一些时间。我会在几分钟后公布答案