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

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

Обновление:
Обратите внимание, что этот вопрос не так прост, как кажется на первый взгляд.
Также обратите внимание, что ответ Timwi неверен, потому что часть [if (ListBox1.SelectedIndex == -1)] не выполняется, если есть выбранный элемент, и я щелкнул в пустом месте, я не знаю, кто проголосовал за него, но его ответ неверен.
я уже написал эту часть кода
если есть функция, которая может преобразовать координаты мыши в элемент списка, тогда проблема будет исправлена


person Karim    schedule 23.08.2010    source источник


Ответы (2)


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

    private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        if(listBox1.SelectedIndex != -1)
        {
            var rect = listBox1.GetItemRectangle(listBox1.SelectedIndex);
            if(rect.Contains(e.Location))
            {
                // process item data here
            }
        }
    }

MouseDoubleClick Информация о версии:

  • .NET Framework — поддерживается в версиях: 4, 3.5, 3.0, 2.0
  • Клиентский профиль .NET Framework — поддерживается в версиях: 4, 3.5 SP1
person max    schedule 23.08.2010

Вот то, что я использовал для одного MouseClick, может быть адаптировано.

Сначала я установил для свойств CheckListBox.CheckOnClick значение true: clb.CheckOnClick = true;

затем я заставил элемент отменить выбор после изменения состояния проверки поля:

void clb_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (clb.Items.Count > 0) { clb.SetSelected(0, false); }
    }
person user3430297    schedule 17.03.2014