winForms+;DataGridView绑定到列表<;T>;

winForms+;DataGridView绑定到列表<;T>;,winforms,data-binding,Winforms,Data Binding,我正在尝试将列表绑定到DataGridView控件,但我没有创建自定义绑定的机会 我试过: gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode")); 它抛出一个异常,表示该属性名未找到任何内容 该列的名称为“操作码”。列表中属性的名称为操作码 回答编辑:问题是我的类中没有可绑定字段作为属性,只有公共字段……显然它不反映字段,只有属性。网格上的属性也是绑定到操作码的吗?。。若要直接绑定到列表,只需DataSource

我正在尝试将
列表
绑定到DataGridView控件,但我没有创建自定义绑定的机会

我试过:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode"));
它抛出一个异常,表示该属性名未找到任何内容

该列的名称为“操作码”。
列表中属性的名称为操作码


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

网格上的属性也是绑定到操作码的吗?。。若要直接绑定到列表,只需DataSource=List即可。数据绑定允许自定义绑定。您是否正在尝试执行数据源以外的操作

你得到的是一堆空行?自动生成的列是否有名称?您是否已验证对象中是否有数据(而不仅仅是string.empty)

类MyObject
{
公共字符串Something{get;set;}
公共字符串文本{get;set;}
公共字符串其他{get;set;}
}
公共表格1()
{
初始化组件();
List myList=新列表();
对于(int i=0;i<200;i++)
{
string num=i.ToString();
添加(新的MyObject{Something=“Something”+num,Text=“Some Row”+num,Other=“Other”+num});
}
dataGridView1.DataSource=myList;
}

这应该可以很好地工作…

我真的不知道您想要对所包含的示例执行什么操作,但是如果您只想列出对象,那么绑定到通用对象列表是相当简单的:

    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;

    }
private BindingSource\u gridSource;
私有绑定源GridSource
{
得到
{
if(_gridSource==null)
_gridSource=新的BindingSource();
返回网格源;
}
}
私有void Form1\u加载(对象发送方、事件参数e)
{
列表=新列表();
添加(新的FluffyBunny{Color=“White”,EarType=“Long”,Name=“Stan”});
添加(新的FluffyBunny{Color=“Brown”,EarType=“Medium”,Name=“Mike”});
添加(新的FluffyBunny{Color=“Mottled”,EarType=“Short”,Name=“Torvald”});
GridSource.DataSource=list;
dataGridView1.Columns[“EarType”].Visible=false;//可以选择隐藏列
dataGridView1.DataSource=GridSource;
}
如果只想显示列表类型的特定属性,则应该能够使不需要的列不可见

从技术上讲,您实际上不需要创建BindingSource,但我发现,如果我有BindingSource,那么当我进行更新或更改时,它会简单得多


希望这有帮助。

也有同样的问题。。。显然,我有一个带有公共字段的结构。网格中没有任何内容。提供了公共getter,有效。

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

这对我来说很好,

是的。如果我只做DataSource=list,我会得到一堆空列。所以你只想将网格绑定到自定义对象列表中的操作码属性?如果我要求的是强制转换,那么请执行。。。Grid.DataSource=MyList.Select(o=>o.Opcode);类中有三个字符串,操作码是其中之一。这个类是列表的类型,我希望每个字符串都是一列,每个列表项都是一行…另一件事。。对象中的字符串是属性,而不仅仅是公共字段,对吗?。。如果你能发布对象的定义,也可能会有所帮助。当直接绑定到列表时,我得到一堆空行,没有数据。列表中的类只包含3个字符串。谢谢Jared!当我试图弄清楚如何在使用列表时创建新行时,您关于BindingSource的评论确实帮助了我。点击一下!哈哈,这正是我在评论中添加的内容,很高兴你的问题得到了解决。+1我也遇到了同样的问题。吸球的男人!!!你真是天赐之物。我已经连续六个小时为这个问题绞尽脑汁了。尝试了我能想到的一切,也尝试了我能想到的一切。不走运。终于找到了你的帖子,当然,我很忙,把它们做成了字段,而不是属性。使用
BindingList
可以避免我绑定DataGridView的麻烦!非常感谢。


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;
}