0

XML ファイルから辞書にフィールドを読み込むプログラムがあります。辞書の値から dataGridView に名前を付けて列を作成したいと思います。問題は、実行時までディクショナリ内の値がどのようなものになるのか、どのような順序になるのかがわからないことです。これをプログラムで行う方法と、どのタイプの列になるか (コンボボックス、テキストボックスなど) を指定する方法はありますか?

 custXML=
        doc.Descendants("DT100")
           .ToDictionary(d => (int)d.Element("import_seq"),
                         d => (string)d.Element("display_name"));

custXML は、import_seq をキー、display_name を値とするディクショナリです。これが私がデータグリッドビューに追加しようとしたものです(固定64列があり、そのうちのいくつかは空かもしれません):

DataGridViewColumn[] foo = new DataGridViewColumn[64];
for (int i = 0; i < 63; i++)
  foo[i] = new DataGridViewColumn();

foreach (KeyValuePair<int, string> item in custXML)
{
  for (int i = 0; i < 63; i++)
    foo[i].HeaderText = item.Value.ToString();
}

for (int i = 0; i < 63; i++)
  dataGridView1.Columns.Add(foo[i]);

ただし、それを実行すると、列の名前はすべて「ソースコード」と表示されます

4

1 に答える 1

0

あなたのコードで

foreach (KeyValuePair<int, string> item in custXML)
        {
            for (int i = 0; i < 63; i++)
                foo[i].HeaderText = item.Value.ToString();
        }

すべての列ヘッダーを同じ文字列に繰り返し変更します。したがって、それらはすべて、XML の最後の項目の名前になります。すべての DataGridViewColumns をループする代わりに、新しいキーと値のペアごとに、適切な DataGridViewColumn のタイトルを設定する必要があります。

実装は演習として残しておきます:)

編集してコメントに答える:

foreach はディクショナリを反復しますが、内側のループは現在のディクショナリ項目をすべての列に適用します。したがって、最終的に、すべての列が最後のディクショナリ エントリのアイテム値を取得します。あなたがやろうとしていることを理解したら、おそらく内側のループを

if (item.Key >= 0  && item.Key <= 63)
    foo[item.Key].HeaderText = item.Value.ToString();
于 2012-12-04T22:00:19.373 に答える