2008-09-24 123 views
34

我试图将List<T>绑定到DataGridView控件,并且我没有创建自定义绑定的任何运气。winForms + DataGridView绑定到列表<T>

我曾尝试:

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

它抛出一个异常,说什么也没有通过属性名称中。

问题列的名称是“操作码”。 List<T>中属性的名称是Opcode。

回答编辑:问题是我没有在我的类中的可绑定字段作为属性,只是公共领域......显然它不反映在字段,只是属性。

+0

LOL这正是我在我的意见又增加了,很高兴你有你的问题解决了。 – 2008-09-24 03:15:11

+2

+1我刚刚有同样的问题。男人,吮球! – 2009-12-10 23:53:27

+0

你是天赐之物。我已经连续六个小时一直在对付这个问题的头脑。尝试了我能想到的一切,以及我能想到的一切。没有运气。最后找到你的帖子,当然,我很匆忙,并把他们的领域,而不是属性。 – Locke 2016-10-08 02:19:29

回答

14

网格上的属性是否绑定到Opcode上?如果要直接绑定到List,则只需DataSource = list。数据绑定允许自定义绑定。你是否想要做一些比数据源更多的东西?

你会得到一堆空行?自动生成的列有名字吗?你有没有验证数据是在对象(不只是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; 
    } 

这应该做工精细...

+0

是的。如果我只是做DataSource = list,我会得到一堆空列。 – FlySwat 2008-09-24 02:58:25

5

我真的不能告诉你想你怎么了包括例如做,而是结合对象的泛型列表是,如果你非常简单只是要列出的对象:

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; 

    } 

如果你只是想显示List的类型的特定属性,你应该能够使不必要的列(S)隐形。

从技术上讲,你并不需要创建BindingSource,但是如果我有更新或更改,我发现它更容易一些。

希望这会有所帮助。

4

有同样的问题...我明显有公共领域的结构。网格中没有任何东西。提供公共获得者,工作。

3

我发现的另一个解决方案是使用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; 
} 

它正常工作对我来说,

相关问题