Иногда, при работе с компонентом ListView в C# необходимо узнать в каком конкретно месте элемента был произведен клик мышкой, например, узнать был ли произведен клик в области расположения иконки элемента, или же пользователь кликнул по метке элемента в ListView. В примерах ниже показано как в ListView узнать, что пользователь кликнул по определенной области элемента ListViewItem
.
У компонента ListView
, как и у любого наследуемого от класса Control
компонента имеется ряд событий, позволяющих обрабатывать клики мышкой, в том числе и по элементам ListViewItem
(Mouse
, 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
в котором:
- Получили объект класса
ListViewHitTestInfo
с информацией об элементе; - Вывели сообщение о местоположении курсора в момента нажатия кнопки, для чего воспользовались свойством
Location
объектаinfo
. - Проверили, действительно ли лик был произведен на
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