检测鼠标点击是否击中不在列表框中的项目[c#]

本文关键字:项目 鼠标 是否 检测 列表 | 更新日期: 2023-09-27 18:04:25

如果用户单击列表框中的一个项目,则调用listboxItems_SelectedIndexChanged。但是,即使用户错过了一个项目,并在列表框内随机单击(不是在项目上),listboxItems_SelectedIndexChanged仍然被调用。

我怎样才能改变这个?

检测鼠标点击是否击中不在列表框中的项目[c#]

我猜在某些情况下,你没有足够的列表项目在你的控制,因此你有一些空间,你可以点击,然后SelectedIndexChanged被触发。

我猜你不能动态地调整控件的大小来适应列表项的数量,否则你就不会问这个问题了。

现在,当用户单击(选择)相同的列表项时应该发生什么?即使选择的索引是相同的,是否也会发生某些逻辑(因此,当第一次单击索引时,也会发生相同的逻辑)?

如果您需要忽略多次选择相同的索引,那么您可以使用以下技巧:

在表单范围(包含列表框控件的表单)保留一个变量,每次选择索引更改时设置该变量。然后稍后使用它来检查是否进行了相同的选择以忽略对事件的处理。下面是一个例子:

 private int _currSelIdx = -1; // Default value for the selected index when no selection
 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
 {
      if (listBox1.SelectedIndex == _currSelIdx)
         return;
      Console.WriteLine(listBox1.SelectedIndex);
      _currSelIdx = listBox1.SelectedIndex;
 }
它不漂亮,但是嘿…无论工作!

也许SelectedIndexChanged不是放置逻辑的正确位置,因为即使在使用键盘更改选择时也会触发它。我会使用MouseClick来代替,检查点击是否发生在选中的项目上,例如:

    private void listBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if (listBox1.SelectedIndex < 0 || !listBox1.GetItemRectangle(listBox1.SelectedIndex).Contains(e.Location))
            MessageBox.Show("no click");
        else
            MessageBox.Show("click on item " + listBox1.SelectedIndex.ToString());
    }

这个链接可能会有帮助,而不是双击,实现相同的单一点击

我想检测一个项目双击在winforms列表框控件。[如何处理点击空白区域?])