C# WinForms: как в ListView узнать, что пользователь кликнул по определенной области элемента?

Иногда, при работе с компонентом ListView в C# необходимо узнать в каком конкретно месте элемента был произведен клик мышкой, например, узнать был ли произведен клик в области расположения иконки элемента, или же пользователь кликнул по метке элемента в ListView. В примерах ниже показано как в ListView узнать, что пользователь кликнул по определенной области элемента ListViewItem.

У компонента ListView, как и у любого наследуемого от класса Control компонента имеется ряд событий, позволяющих обрабатывать клики мышкой, в том числе и по элементам ListViewItem (MouseClick, MouseUp и т.д.).  Используя эти события мы можем определить координаты (X, Y) расположения курсора мышки в моменты вызова события. Например, ниже показан обработчик события MouseClick, позволяющий вывести на экран значения координат курсора мыши в момент клика:

private void OrgView_MouseClick(object sender, MouseEventArgs e)
{
   MessageBox.Show($"X = {e.X} Y = {e.Y}");
}

Аналогично можно узнать координаты и в моменты нажатия кнопки мыши, её отпускания и т.д. В обработчика этих событий мы можем воспользоваться методом HitTest(), который вернет нам информацию об элементе, заданном координатами x и y. Например, следующим образом:

private void OrgView_MouseClick(object sender, MouseEventArgs e)
{
    MessageBox.Show($"X = {e.X} Y = {e.Y}");
    ListViewHitTestInfo info = OrgView.HitTest(e.X, e.Y);
}

Используя возвращаемое функцией HitTest() значение мы можем легко узнать в каком месте элемента находился курсор мыши, например, при нажатии кнопки:

private void OrgView_MouseDown(object sender, MouseEventArgs e)
{
    ListViewHitTestInfo info = OrgView.HitTest(e.X, e.Y);
    MessageBox.Show($"Location = {info.Location}");
    if (info.Location.Equals(ListViewHitTestLocations.StateImage))
        MessageBox.Show("StateImage Clicked");
}

Здесь мы написали обработчик события MouseDown в котором:

  1. Получили объект класса ListViewHitTestInfo с информацией об элементе;
  2. Вывели сообщение о местоположении курсора в момента нажатия кнопки, для чего воспользовались свойством Location объекта info.
  3. Проверили, действительно ли лик был произведен на StateImage и вывели ещё одно сообщение на экран.

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

AboveClientArea 256 Позиция части элемента управления ListView, расположенной над клиентской областью.
BelowClientArea 16 Позиция части элемента управления ListView, расположенной под клиентской областью.
Image 2 Позиция в пределах изображения, содержащегося в элементе ListView или ListViewItem.
Label 4 Позиция в пределах текстовой области, содержащейся в элементе ListView или ListViewItem.
LeftOfClientArea 64 Позиция части элемента управления ListView, расположенной слева от клиентской области.
None 1 Позиция за пределами элемента ListViewItem
RightOfClientArea 32 Позиция части элемента управления ListView, расположенной справа от клиентской области.
StateImage 512 Позиция в пределах изображения, сопоставленного с элементом ListViewItem и указывающего состояние элемента.

Таким образом, чтобы в ListView узнать, что пользователь кликнул по определенной области элемента нам достаточно воспользоваться в обработчике клика мышкой методом HitTest и. затем, сравнить свойство  ListViewHitTestInfo.Location с одним или несколькими значениями перечисления ListViewHitTestLocations

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии