如何读取多列ListView控件的列名?

时间:2013-02-20 16:43:05

标签: c# listview multiple-columns

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

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

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

“ColumnHeader:Text:Id”

我必须解析才能找到正确的名称“Id”。 这看起来不像C#的精神。

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


好这是完整的代码。 确切的问题是用户使用Courier Names和Ids在listView中选择一行,但它也可以是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++;
}

2 个答案:

答案 0 :(得分:6)

由于listView.Columns的类型为ListView.ColumnHeaderCollection,因此它包含ColumnHeader个对象。

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

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

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

<强>更新

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

答案 1 :(得分:0)

使用此代码:

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;
}

只需将项目文本提供给此代码,即可获得所需的所有列。

享受;)