【问题标题】:How to read column names of a multicolumn ListView control?如何读取多列 ListView 控件的列名?
【发布时间】:2013-02-20 16:43:04
【问题描述】:

查找 ListView 列名的最佳方法是什么?

我使用在此论坛上找到的过程将 DataTable 转换为 List,但我无法将 Id 列放在首位,尤其是因为并非所有 DataTable 都有“Id”列。

我可以在集合 listView.Columns.ToString() 中搜索,但我看到的格式是:

“列标题:文本:ID”

我必须对其进行解析以找到正确的名称“Id”。 这看起来不像 C# 的精神。

我也试过了:listView.SelectedItems[0].SubItems["Id"] 但这不会编译。


好的,这是完整的代码。 确切的问题是用户在 listView 中使用 Courier Names 和 Ids 选择了一行,但它也可能是 Ids 和 Names,按此顺序。查找所选快递员 ID 的最快方法是:

ListViewItem si = listCouriers.SelectedItems[0];
CourierId = si.SubItems["Id"].Text;

但这不起作用。硬编码的方式是这样,但我不能保证有一天会使用错误的列:

ListViewItem si = listCouriers.SelectedItems[0];
CourierId = si.SubItems[1].Text;

使用@HuorSwords 方法会导致这个不太简单的解决方案,它对我有用,但取决于ColumnHeaderCollection 中的列顺序与表单上的显示相对应的合理假设:

ListViewItem si = listCouriers.SelectedItems[0];
string CourierId = null;
int icol = 0;
foreach (ColumnHeader header in listCouriers.Columns)
{
    if (header.Text == "Id")
    {
        CourierId = si.SubItems[icol].Text;
        break;
    }
    icol++;
}

【问题讨论】:

  • 注意: OP 标题明确询问 Name 属性,由于 MS 错误,该属性为空。然而你已经接受了一个只给出 Text.. 的答案

标签: c# listview multiple-columns


【解决方案1】:

由于listView.ColumnsListView.ColumnHeaderCollection 类型,所以它包含ColumnHeader 对象。

ColumnHeader.Text 包含列标题,因此您可以使用以下命令检查具体列:

foreach (ColumnHeader header in listView.Columns)
{
      if (header.Text == "Id")
      {
           // Do something...
      }
}

我不知道是否是最好的方法,但您无需解析结果即可找到“Id”值...

更新

另外,您是否尝试使用String 索引器引用它? > listView.Columns["Id"]

【讨论】:

  • 谢谢!听起来很简单,但我没想到一边看ColumnHeaders,一边看ListViewItem listView.SelectedItems[0]。但我必须将var 更改为ColumnHeader 才能使用.Text
  • 现在的问题是.ColumnHeaderCollection 的顺序是否与我在表格上看到的相同。最合乎逻辑的是,我会试试这个。
  • @HenriqueC。 header 的类型为“ColumnHeader”,正如MSDN 所说,此类存在“Text”属性。
  • @HenriqueC。那么答案仍然有效。 ;)
  • @HuorSwords 是的,但是请把 var 改成 ColumnHeader。
【解决方案2】:

使用此代码:

private ColumnHeader GetColumn(string Text)
{
    for (int i = 0; i < listView1.Columns.Count; i++)
        for (int j = 0; j < listView1.Items.Count; j++)
            if (listView1.Items[j].SubItems.Count - 1 >= i)
                if (listView1.Items[j].SubItems[i].Text == Text)
                    return listView1.Columns[i];
    return null;
}

只需为该代码提供项目文本并获取列中所需的所有内容。

享受;)

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 1970-01-01
    • 2011-12-10
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多