双击 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 对象。 ListViewItemSubItem 都在 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 的一行时选择了哪一列的主要内容,如果未能解决你的问题,请参考以下文章

比较两个 JSON 并显示我们更改了哪一列的活动?

了解正在更新的列

如何知道用户在 SwiftUI 中的日期选择器中触摸了哪一天

在表格中选择一行时,如何通知详细视图选择了哪一行?

怎么知道用户选择的wpf的datagrid的哪一列

WPF中如何实现在listview中直接实现编辑功能?