C# ListViewHitTestInfo.Item.SubItems.IndexOf给出了错误的值
我有一个Listview,当用户双击最后一列(index=7)时,我想在其中做出反应 我正在使用以下代码:C# ListViewHitTestInfo.Item.SubItems.IndexOf给出了错误的值,c#,.net,winforms,C#,.net,Winforms,我有一个Listview,当用户双击最后一列(index=7)时,我想在其中做出反应 我正在使用以下代码: Point mousePos = this.lvInfo.PointToClient(Control.MousePosition); ListViewHitTestInfo hitTest = this.lvInfo.HitTest(mousePos); int columnIndex = hitTest.Item.SubItems.IndexOf(hitTest.SubItem); if
Point mousePos = this.lvInfo.PointToClient(Control.MousePosition);
ListViewHitTestInfo hitTest = this.lvInfo.HitTest(mousePos);
int columnIndex = hitTest.Item.SubItems.IndexOf(hitTest.SubItem);
if (columnIndex == 7)
MessageBox.Show("Test!");
我得到了错误的columnIndex值,不知道为什么。
即使我总是单击同一列,值似乎也会发生变化。我尝试了这种不同的方法,效果很好
private void lvInfo_MouseUp(object sender, MouseEventArgs e)
{
this.X = e.X;
this.Y = e.Y;
}
private void lvInfo_DoubleClick(object sender, EventArgs e)
{
// if double clicked on gas column open dialog for entering new gas value
Point mousePos = new Point(this.X,this.Y);
ListViewHitTestInfo info = lvInfo.HitTest(mousePos);
int colNr = info.Item.SubItems.IndexOf(info.SubItem);
if (colNr == 7)
{
MessageBox.Show("Test");
}
}
我也在(单次)点击事件中尝试了这一点。同样的问题。我已经试过你的代码了,它工作得很好,我总是得到正确的列索引。我从默认更改的ListView的唯一属性是View改为Details,FullRowSelect改为True,否则我无法单击其他列。您的ListView上是否有任何其他非默认属性?非默认属性会影响这一点。但我找到了一个解决方案(见我的答案)(multiselect=false,Headerstyle=non-clickable)。但我使用的是ListView的自定义扩展,它支持双缓冲并过滤掉WM_ERASEBKGND消息,以减少闪烁。也许这会引起问题?恐怕我不知道。如果你很好奇,那么暂时将扩展注释掉,看看它是否有效。很高兴你找到了解决办法。您应该将您的答案标记为已接受。PointToClient方法似乎不适用于我的。已编辑的我的答案。这现在适用于X和Y位置。别问我为什么。你抢先一步,我正要发布基于X/Y值的代码。我总是慢了一分钟。不管怎样,Congat正在努力让它工作!:-)