【发布时间】:2011-01-23 13:58:21
【问题描述】:
我需要在 C# 中的 ListView 中点击该列
我有一些来自How to determine the clicked column index in a Listview 的示例代码,但我不确定应该如何实现它。
【问题讨论】:
我需要在 C# 中的 ListView 中点击该列
我有一些来自How to determine the clicked column index in a Listview 的示例代码,但我不确定应该如何实现它。
【问题讨论】:
ListView 控件有一个HitTest 方法。你给它鼠标点击事件的 x 和 y 坐标,它给你一个对象,告诉你当时的行(列表视图项)和列(列表视图子项)。
【讨论】:
这是 VB.NET 代码,但对象应该相同。
Private LVUsersLastHit As Point
Private Sub lvUsers_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lvUsers.MouseUp
Me.LVUsersLastHit = e.Location
End Sub
Private Sub LvUsers_Doubleclick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvUsers.DoubleClick
Dim HTI As ListViewHitTestInfo = Me.lvUsers.HitTest(Me.LVUsersLastHit)
If HTI.Item Is Nothing OrElse HTI.SubItem Is Nothing Then Exit Sub 'nothing was dblclicked
MsgBox("doubleClicked the " & HTI.Item.ToString & " Item on the " & HTI.SubItem.ToString & " sub Item")
End Sub
【讨论】:
天啊,大家都懒得贴代码了。该过程分为三个步骤:
Control.MousePosition 获取鼠标位置并转换为客户端坐标。HitTest 函数查找鼠标指向的内容。这将返回一个包含大量信息的对象,但实际列号除外...IndexOf 搜索子项数组以找到列号。代码如下:
private void listViewMasterVolt_DoubleClick(object sender, EventArgs e)
{
Point mousePosition = myListView.PointToClient(Control.MousePosition);
ListViewHitTestInfo hit = myListView.HitTest(mousePosition);
int columnindex = hit.Item.SubItems.IndexOf(hit.SubItem);
}
【讨论】:
MouseDown 事件中使用e.Location 编写最后两行代码!
ListView.CheckBoxes = true、FullRowSelect = true),您可能需要使用if (mousePosition.X >= 20) {... toggle checkbox ...}
e.Column 实际上保存着索引
private void lv_ColumnClick(object sender, ColumnClickEventArgs e)
{
Int32 colIndex = Convert.ToInt32(e.Column.ToString());
lv.Columns[colIndex].Text = "new text";
}
【讨论】:
ColumnClick 仅对点击列headers有效