Определить, попадет ли щелчок мыши по элементу, отсутствующему в списке [C #] - PullRequest
3 голосов
/ 03 августа 2011

Если пользователь щелкает элемент в списке, вызывается listboxItems_SelectedIndexChanged.Но даже если пользователь пропускает элемент и случайно щелкает внутри списка (не для элементов), listboxItems_SelectedIndexChanged по-прежнему вызывается.

Как это можно изменить?Я хочу, чтобы действие выполнялось только при нажатии элемента.

Примечание. Удаление возможности навигации по приложению с помощью клавиатуры невозможно.

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Я полагаю, что в некоторых случаях у вас недостаточно элементов списка в вашем элементе управления, поэтому у вас есть некоторое пространство, на которое вы можете нажать, а затем вызывается SelectedIndexChanged .

Я думаю, вы не можете динамически изменить размер элемента управления, чтобы всегда соответствовать количеству элементов списка, иначе вы бы не задавали этот вопрос.

Теперь, что должно произойти, когда пользователь щелкает (выбирает) тот же элемент списка? Должна ли какая-то логика происходить, даже если выбранный индекс совпадает (например, при первом щелчке по нему происходит та же логика)?

Если вам требуется, чтобы выбор одного и того же индекса более одного раза игнорировался, тогда вы можете воспользоваться следующим хаком:

Сохраняйте переменную в области формы (форма, содержащая элемент управления listbox), и каждый раз, когда изменяется индекс выбора, задайте эту переменную. Затем используйте его позже, чтобы проверить, был ли сделан такой же выбор, чтобы игнорировать обработку события. Вот пример:

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

Это не красиво, но эй ... что бы ни работало!

0 голосов
/ 03 августа 2011

Может быть, 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());
    }
0 голосов
/ 03 августа 2011

Эта ссылка может помочь, вместо двойного щелчка, реализовать то же самое для одиночного щелчка

Я хочу обнаружить двойной щелчок элемента в элементе управления winforms listbox. [как обрабатывать клик по пустой области?]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...