【问题标题】:winForms + DataGridView binding to a List<T>winForms + DataGridView 绑定到 List<T>
【发布时间】:2010-09-12 14:41:04
【问题描述】:

我正在尝试将 List&lt;T&gt; 绑定到 DataGridView 控件,但我没有任何运气来创建自定义绑定。

我试过了:

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

它抛出一个异常,表示该属性名称没有找到任何东西。

相关列的名称是“操作码”。 List&lt;T&gt; 中的属性名称为 Opcode。

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

【问题讨论】:

  • 哈哈,这正是我在我的 cmets 中添加的内容,很高兴你的问题得到了解决。
  • +1 我也遇到了同样的问题。吸蛋的男人!!!
  • 你真是天赐之物。现在,我已经连续六个小时一直在努力解决这个问题。尝试了我能想到的一切,以及我能想到的谷歌。没有运气。终于找到了你的帖子,当然,我很着急,把它们设为字段,而不是属性。

标签: winforms data-binding


【解决方案1】:

您是否也将网格上的属性绑定到 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;
    }

这应该可以正常工作...

【讨论】:

  • 是的。如果我只是做 DataSource = list,我会得到一堆空列。
  • 所以您只想将网格绑定到自定义对象列表中的操作码属性?
  • 如果我问的是演员阵容,那就做... Grid.DataSource = MyList.Select(o => o.Opcode);
  • 类中有三个字符串,Opcode就是其中之一。此类是 List 的类型,我希望每个字符串为一列,每个列表项为一行...
  • 另一件事..对象中的字符串是属性,而不仅仅是公共字段,对吗?...如果您可以发布对象的定义,它也可能会有所帮助。
【解决方案2】:

我无法真正告诉您要对包含的示例进行什么操作,但是如果您只想列出对象,则绑定到通用对象列表相当简单:

    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,但如果我有它,我发现在进行更新或更改时会容易得多。

希望这会有所帮助。

【讨论】:

  • 直接绑定到 List 时,我得到一堆空行,没有数据。 List 中的类只包含 3 个字符串。
  • 谢谢贾里德!当我试图弄清楚如何在使用 List 时创建新行时,您对 BindingSource 的评论对我很有帮助。点击一下!
【解决方案3】:

有同样的问题......我显然有一个带有公共字段的结构。网格中没有任何内容。提供公共吸气剂,工作。

【讨论】:

    【解决方案4】:

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

    对我来说很好用,

    【讨论】:

    • 使用BindingList&lt;T&gt; 让我在尝试绑定DataGridViews 时省了力气!谢谢。
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 2013-05-17
    • 2013-10-24
    • 2017-05-18
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多