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