web-dev-qa-db-ja.com

winForms + DataGridViewをList <T>にバインド

List<T>をDataGridViewコントロールにバインドしようとしていますが、カスタムバインディングを作成することができません。

私が試してみました:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode"));

そのプロパティ名で何も見つからなかったと言って例外をスローします。

問題の列の名前は「Opcode」です。 List<T>のプロパティの名前はOpcodeです。

ANSWER EDIT:問題は、クラスにバインド可能なフィールドがプロパティとしてなく、パブリックフィールドだけだったということでした...どうやら、フィールドには反映せず、プロパティだけです。

34
FlySwat

グリッドのプロパティはOpcodeにもバインドしていますか?データバインディングはカスタムバインディングを可能にします。データソース以外のことをしようとしていますか?

空の行がたくさん表示されますか?自動生成された列に名前はありますか?データがオブジェクト内にあることを確認しましたか(string.emptyだけではありません)?

    class MyObject
    {
        public string Something { get; set; }
        public string Text { get; set; }
        public string Other { get; set; }
    }

    public Form1()
    {
        InitializeComponent();

        List<MyObject> myList = new List<MyObject>();

        for (int i = 0; i < 200; i++)
        {
            string num = i.ToString();
            myList.Add(new MyObject { Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num  });
        }

        dataGridView1.DataSource = myList;
    }

これはうまくいくはずです...

14

あなたが含めた例であなたが何をしようとしているのか本当にわかりませんが、オブジェクトの一般的なリストへのバインドは、オブジェクトを一覧表示したいだけの場合はかなり簡単です:

    private BindingSource _gridSource;

    private BindingSource GridSource
    {
        get
        {
            if (_gridSource == null)
                _gridSource = new BindingSource();
            return _gridSource;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        List<FluffyBunny> list = new List<FluffyBunny>();
        list.Add(new FluffyBunny { Color = "White", EarType = "Long", Name = "Stan" });
        list.Add(new FluffyBunny { Color = "Brown", EarType = "Medium", Name = "Mike" });
        list.Add(new FluffyBunny { Color = "Mottled", EarType = "Short", Name = "Torvald" });

        GridSource.DataSource = list;
        dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column
        dataGridView1.DataSource = GridSource;

    }

リストのタイプの特定のプロパティのみを表示したい場合は、不要な列を非表示にすることができます。

技術的には、BindingSourceを実際に作成する必要はありませんが、更新や変更がある場合は、それを行う方がはるかに簡単です。

お役に立てれば。

5
Jared

同じ問題があった...私は明らかにパブリックフィールドを持つ構造体を持っていた。グリッドには何もありません。公開ゲッターを提供し、機能しました。

4
bill gates

私が見つけた別の解決策は、BindingListコレクションを使用することです。



private void Form1_Load(object sender, EventArgs e)
{
   BindingList people= new BindingList {
    new Person {Name="John",Age=23},
    new Person {Name="Lucy",Age=16}
  };

   dataGridView1.DataSource= people;
}

私にとってはうまくいきます

4
Nikola Stjelja