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

时间:2011-08-03 05:34:20

标签: c# winforms listbox

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

我该怎么改变?我只想对项目点击进行操作。

注意:无法使用键盘删除导航应用程序的功能。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我想在某些情况下,您的控件中没有足够的列表项,因此您可以单击一些空间,然后触发 SelectedIndexChanged

我猜你无法动态调整控件的大小以始终适合列表项的数量,否则你不会问这个问题。

现在,当用户点击(选择)同一个列表项时会发生什么?即使选定的索引是相同的,也应该发生一些逻辑(所以当第一次发生相同的逻辑时点击它)?

如果您需要多次选择同一个索引,则可以使用以下hack:

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

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

它不漂亮,但是嘿......无论什么都有效!

答案 2 :(得分:0)

可能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());
    }