C# 无法通过DataBoundItem更新DataGridView单元格?

C# 无法通过DataBoundItem更新DataGridView单元格?,c#,winforms,C#,Winforms,我用两个控件创建了一个表单dataGridView1和button1 public partial class Form1 : Form { public List<Foo> ds { get; private set; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) {

我用两个控件创建了一个表单
dataGridView1
button1

public partial class Form1 : Form
{
    public List<Foo> ds { get; private set; }

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ds = new List<Foo> {
            new Foo { A="abc" }, new Foo{B="bbb"}
        };
        dataGridView1.DataSource = new BindingList<Foo>(ds);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var foo = (Foo)dataGridView1.Rows[0].DataBoundItem;
        foo.B = "1BBB";
        foreach(DataGridViewRow x in dataGridView1.Rows)
        {
            if (x.DataBoundItem != null)
                ((Foo)x.DataBoundItem).C = "CCC";
        }
    }
}

您需要刷新数据源的绑定,因为您直接更改的是有界实例,而不是单元格

试试这个:

  foreach ( DataGridViewRow x in dataGridView1.Rows )
  {
    if ( x.DataBoundItem != null)
      ((Foo)x.DataBoundItem ).C = "CCC";
  }
  dataGridView1.DataSource = new BindingList<Foo>(ds);
因此,网格和有界实例都会更新

您不需要BindingList,可以在第一次修改后编写:

dataGridView1.DataSource = null;
dataGridView1.DataSource = ds;
这是一个更好的模式:

但是我们可以使用DataTable,或者更好的是,在使用VisualStudio设计器并在表单上使用表的拖放来编写更少的代码并自动生成datagrid和所有非可视化数据组件的同时,使用具有DataTable的DataSet

这里是一个摘要

要刷新已修改的
DataBoundItem
的视图,该数据源是
bindingslist
或仅仅是
List
的数据源的对象,我们可以重新分配该数据源

但是如果它是
BindingSource
,您可以在
bindingsure
上使用
ResetBindings

但是,如果使用
DataTable
而不是列表上的数据源,则可以在DataBoundItem(DataRowView)上使用
EndEdit

那么问题是在这里最好做什么:在列表上使用BindingSource,或者创建DataTable并管理LoadFromStream和SaveFromStream,因为您说过数据来自IEnumerable流

因此,您可以查看
CopyToDataTable()
以将
列表映射到
数据表

更改值后添加“EndEdit”:

private void button1_Click(object sender, EventArgs e)
    {
        var foo = (DataRowView)dataGridView1.Rows[0].DataBoundItem;
        foo["B"] = "1BBB";
        foo.EndEdit();
    }

您还可以将源代码更改为绑定源代码,然后直接处理表。

为什么要讨论这个问题?实际上,这对我来说是一个有趣的问题会很贵吗?这个列表可能很大,我需要每秒更新一次。我在另一个SO问题的答案中读到,更新绑定数据源也会更新控件。如果您有大量数据。但你不需要按照解释那样做。您可能更喜欢操纵网格单元。您还可以编写
dataGridView1.DataSource=ds.ToList()
dataGridView1.DataSource=ds,因为它只使用一个赋值刷新绑定,所以成本较低。或者创建一个datatable进行自动刷新。使用强类型数据集更好:在项目中添加一个新的数据项作为数据集,然后打开它,然后可以设计数据结构或在其上删除数据库项。就这么简单。我可能需要从流中填充数据源。可能需要使用被动框架。强类型数据集仍然是更好的选择吗?它取决于您想做什么以及需要管理什么数据。对于一个真正的应用程序,是的,你应该至少使用一个强类型的数据集,如果你有一个数据库在后面,如果你想要一台大型机器,你应该使用EF。数据集很好。您知道为什么在绑定到
数据表
时可以将
数据边界项
强制转换为
数据行视图
,而不是
列表
dataGridView1.DataSource = null;
dataGridView1.DataSource = ds;
private void button1_Click(object sender, EventArgs e)
    {
        var foo = (DataRowView)dataGridView1.Rows[0].DataBoundItem;
        foo["B"] = "1BBB";
        foo.EndEdit();
    }