3

ListViewの列の名前を見つけるための最良の方法は何ですか?

このフォーラムで見つけた手順を使用してDataTableをリストに変換しましたが、特にすべてのDataTableに「Id」列があるわけではないため、Id列を最初に配置することはできません。

コレクションlistView.Columns.ToString()で検索できますが、表示される形式は次のとおりです。

"ColumnHeader:テキスト:Id"

これを解析して、適切な名前「Id」を見つける必要があります。これはC#の精神のようには見えません。

私も試しました:listView.SelectedItems[0].SubItems["Id"] しかし、それはコンパイルされません。


OKこれが完全なコードです。正確な問題は、ユーザーが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++;
}
4

2 に答える 2

6

listView.Columnsタイプが であるため、オブジェクトListView.ColumnHeaderCollectionが含まれColumnHeaderます。

には列のColumnHeader.Textタイトルが含まれているため、次の方法で具体的な列を確認できます。

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

最善のアプローチかどうかはわかりませんが、結果を解析して「Id」値を見つける必要はありません...

アップデート

Stringまた、インデクサーで参照しようとしましたか?>listView.Columns["Id"]

于 2013-02-20T16:55:46.443 に答える
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;
}

このコードに項目テキストを与えるだけで、必要な列のすべてを取得できます。

楽しみ ;)

于 2013-06-26T17:28:08.810 に答える