Иногда, при работе с компонентом 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