如何在更新数据源时让绑定的 winforms 控件刷新?

Posted

技术标签:

【中文标题】如何在更新数据源时让绑定的 winforms 控件刷新?【英文标题】:How do I get bound winforms controls to refresh when their datasource is updated? 【发布时间】:2012-04-08 19:27:57 【问题描述】:

我对使用 C#(但不是 C# 本身)和数据绑定的整个概念处理数据库非常陌生,所以请记住这一点。如果这会影响到这一点,我也在使用 SQL Server CE。

我正在尝试使用用 VS2010 构建的强类型数据集来访问 SQL Server CE 数据库,并将 WinForms 控件绑定到它以显示数据。我可以很好地绑定控件,它们显示当前在数据库中的数据没问题。我还可以将新数据插入数据库,如果我重新启动应用程序,插入的数据会显示在控件中(特别是 ComboBox,但我将来会使用更多)。

问题在于,在我重新启动应用程序之前,新行根本不会出现,我对数据绑定的理解是控件应该自动更新自己。我已经阅读过有关 INotifyPropertyChanged 的​​信息,但我不确定在这里使用它是否正确,如果是,我如何将它用于行插入?

我正在像这样绑定组合框:

DataSet.tagDataTable tagdata = new tagTableAdapter().GetData();
comboBox1.DataSource = tagdata;
comboBox1.DisplayMember = tagdata.tagnameColumn.ColumnName;
comboBox1.ValueMember = tagdata.tagIDColumn.ColumnName;

并像这样插入:

Guid g = Guid.NewGuid();
new tagTableAdapter().Insert(g, Name)

其中 Name 只是从文本框中提取的字符串。

谢谢。

编辑:我应该提到我正在使用的数据库表称为标记,有两列,标记ID 和标记名。 tagID 是 GUID,tagname 是 varchar。

【问题讨论】:

请查看How to: Add Rows to a DataTable。我相信通过 DataTable 添加一行将触发必要的通知。如果没有,请尝试将 tagdata 包装在 BindingSource class 【参考方案1】:

您对TableAdpater.Insert 所做的事情是将数据直接插入到数据库中,并且您正在规避应用程序中的任何通知。如果你这样做了,那么你必须按照 iefpw 所说的去做,那就是重新加载你的数据表并重新绑定你的控件。

另一种方法是在数据表中添加一行。你可以试试这样的:

// retrieve the datatable from the control
DataSet.tagDataTable tagdata = comboBox1.DataSource as DataSet.tagDataTable;
// create a new row and fill in the data
var dr = tagdata.NewRow();
dr["tagid"] = Guid.NewGuid();
dr["tagname"] = Name;
// actually add it to the table
tagdata.Rows.Add(dr);

此时您已将其添加到 DataTable 并且您的组合框将自动更新,但需要注意的是它尚未写入您的数据库,因此您需要确保在某个时候保存到您的数据库.

【讨论】:

【参考方案2】:

您应该像第一次那样再次绑定数据并再次刷新控件。它不只是显示数据。它是机械的。它不是实时的。

【讨论】:

以上是关于如何在更新数据源时让绑定的 winforms 控件刷新?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform DataGridView 如何实现删除 更新 手动绑定数据源(不是在控件里指定数据源) 求大神 在线等

WinForm 双向数据绑定

C# winForm程序 数据绑定 更新控件问题 combobox绑定的DataSource 数据表中已经添加了新的数据

Winform 绑定ListView控件

如何将绑定连接到(Winform)ComboBox 控件以从绑定源获取/设置控件中的选择?

Winform开发中如何将数据库字段绑定到ComboBox控件