检测鼠标点击是否击中不在列表框中的项目[c#]
本文关键字:项目 鼠标 是否 检测 列表 | 更新日期: 2023-09-27 18:04:25
如果用户单击列表框中的一个项目,则调用listboxItems_SelectedIndexChanged。但是,即使用户错过了一个项目,并在列表框内随机单击(不是在项目上),listboxItems_SelectedIndexChanged仍然被调用。
我怎样才能改变这个?
我猜在某些情况下,你没有足够的列表项目在你的控制,因此你有一些空间,你可以点击,然后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列表框控件。[如何处理点击空白区域?])