web-dev-qa-db-ja.com

DataGridViewのデータソースとしてリストを使用する

設定ファイルから設定名とそれぞれの値を抽出して、順序付けられた辞書に入れました。辞書には、ICollectionクラスのキーと値が含まれています。そのデータをバインドし、DataGridViewに表示します。文字列を配列にコピーしてそれらの配列を表示しようとしましたが、プログラムを実行したときに列が空白で、まったくバインドされていないようでした。

また、DataGridViewソースを、順序付けられた辞書コレクション(キーまたは値)の1つに直接設定しようとしましたが、それでも望みの結果にはなりませんでした。列はまだ空白でした。ただし、列名が「長さ」の3番目の列が作成され、ICollectionのエントリの長さが表示されます。しかし、言うまでもなく、長さは必要ありません。エントリ自体が必要です。

この質問に使用しているコードは次のとおりです。フォームのロード時に、構成ファイルをロードすると、m_Settingsというプライベートメンバーにすべてのキーと値のペアが含まれます。次に、リストを作成し、キーと値を個別に追加します。バインディングソースを「データ」に設定した後、プログラムを実行すると、追加した両方の列が両方とも空白になります。

    private void Form4_Load(object sender, EventArgs e)
    {
        loadconfigfile(Properties.Settings.Default.Config);
        List<Object> data = new List<Object>();
        data.Add(m_Settings.Keys);
        data.Add(m_Settings.Values);
        bindingSource1.DataSource = data;
        dataGridView1.DataSource = bindingSource1;
        dataGridView1.Refresh();
    }

順序付けされた辞書を取得し、「設定」と「値」というラベルの付いた2つの列にエントリを表示する方法に関するアイデアはありますか?リストはDataGridViewsと互換性のあるDataSourcesだったと思いますが、今は自分自身を推測し始めています。

どんな助けや指示も大歓迎です!必要に応じて詳細情報を提供させていただきます。

ありがとう!

[〜#〜] edit [〜#〜]

実装されたmyStructクラスで修正されたコードは次のとおりです。

    List<myStruct> list = new List<myStruct>();
    for(int index = 0; index < m_Settings.Count; index++)
    {
        myStruct pair = new myStruct(keys[index], values[index].ToString());
        list.Add(pair);
    }

    public class myStruct
    {
        private string Key { get; set; }
        private string Value { get; set; }

        public myStruct(string key, string value)
        {
            Key = key;
            Value = value;
        }
    }

ただし、バインディングDataDourceをリストに設定すると、DataGridViewには何も表示されず、単に空になります。誰もがその理由を知っていますか?

30
tf.rz

まず、すべてのキーと値のカウント回数を追加する理由がわかりません。インデックスは使用されません。

私はこの例を試しました:

        var source = new BindingSource();
        List<MyStruct> list = new List<MyStruct> { new MyStruct("fff", "b"),  new MyStruct("c","d") };
        source.DataSource = list;
        grid.DataSource = source;

それはかなりうまく機能し、正しい名前の2つの列を取得します。 MyStruct型は、バインディングメカニズムが使用できるプロパティを公開します。

    class MyStruct
   {
    public string Name { get; set; }
    public string Adres { get; set; }


    public MyStruct(string name, string adress)
    {
        Name = name;
        Adres = adress;
    }
  }

1つのキーと値を取るタイプを作成し、1つずつ追加してみてください。お役に立てれば。

46
MBen

DataGridViewプロパティを設定します

    gridView1.AutoGenerateColumns = true;

そして、あなたがバインドしているオブジェクトのリストを確認してください、それらのオブジェクトのプロパティはパブリックでなければなりません。

6
Yamanappa

このFuncはあなたを助けるかもしれません。すべてのリストオブジェクトをグリッドビューに追加します

private void show_data()
        {
            BindingSource Source = new BindingSource();

            for (int i = 0; i < CC.Contects.Count; i++)
            {
                Source.Add(CC.Contects.ElementAt(i));
            };


            Data_View.DataSource = Source;

        }

シンプルなデータベースアプリ用にこれを作成します

0
naqib