双击 ListView 的一行时选择了哪一列
Posted
技术标签:
【中文标题】双击 ListView 的一行时选择了哪一列【英文标题】:Which Column was selected when DoubleClick a Row of a ListView 【发布时间】:2020-08-29 21:40:21 【问题描述】:首先,我不是在谈论单击列标题。我说的是选定行中的项目。
我有一个 ListView,想要双击选定行中的 username
列并将用户名复制到剪贴板。
如果我双击选定行的password
列,将密码复制到剪贴板。
显然我们可以知道选择了哪一行,但我不知道如何捕获在该行中双击了哪一列。 这可能吗?
人们想要代码,所以你去吧,记住只能选择单行,所以是的,0 会起作用:
ListViewItem lvi = this.contentListView.SelectedItems[0];
string pass = lvi.SubItems[5].Text;
【问题讨论】:
【参考方案1】:您可以使用 ListView HitTest 方法。它返回一个ListViewHitTestInfo 对象。
它的SubItem 属性为您提供了单击的ListViewSubItem
对象:
可以使用ListViewItem.SubItems.IndexOf() 方法识别对应的ColumnHeader
对象。 ListViewItem
和 SubItem
都在 ListViewHitTestInfo
对象中引用。
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
var hitInfo = listView1.HitTest(e.Location);
if (hitInfo.SubItem == null || string.IsNullOrEmpty(hitInfo.SubItem.Text)) return;
int subItemIndex = hitInfo.Item.SubItems.IndexOf(hitInfo.SubItem);
var column = listView1.Columns[subItemIndex];
// Do whatever you need to do with the SubItem text
string result = ProcessSubItemText(hitInfo.SubItem.Text, column);
Clipboard.SetText(result, TextDataFormat.UnicodeText);
【讨论】:
如此接近.. 是的,它提供了数据,但我如何获得列名?我需要它,因为密码不是明文,它是加密的,然后是 base64。当然,我可以尝试扭转这种情况,如果不是加密密码,这将失败。我什至可以抓住 item.text 然后遍历,找到行,然后遍历列以查找选择了哪一列,但我希望比这更干净一些。 hitInfo.SubItem.Name 似乎总是为空。 我找到了一个解决方法.. ListViewItem item = new ListViewItem(accountName, 0); ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem(); lvsi.Name = "用户名"; lvsi.Text = 用户名; item.SubItems.Add(lvsi); 查看编辑。您可以使用 HitTest 提供的 Item。以上是关于双击 ListView 的一行时选择了哪一列的主要内容,如果未能解决你的问题,请参考以下文章