绑定组合框在(重新)填充数据源时更改 SelectedItem

Posted

技术标签:

【中文标题】绑定组合框在(重新)填充数据源时更改 SelectedItem【英文标题】:Bound Combobox changing SelectedItem when (re)filling Datasource 【发布时间】:2021-07-23 21:05:36 【问题描述】:

我在 Winform 的 Comboboxes 上遇到了一个非常具体的行为。我发现了很多非常相似的问题,但对我的问题没有有用的答案:

我有一个表单,其中控件通过 TableAdapter/manager 绑定到 SQL 数据源。一些值链接到 Combobox 类型的 Lookuptables。当我第一次填充基础数据集时,一切都正确显示。我可以从 Combobox(字段 id 和 NamedItem)中选择项目,其中“id”作为数据成员绑定到基本数据集表,“NamedItem”是 Combobox 的 DisplayMember。

更改值或更新时没有问题,但是...

一旦我必须重新填充 Combobox 底层数据源(例如,如果添加了条目),则 Combobox 的选定索引设置为 0 - 表示列表中的第一项。

当然,我可以记住 selectedindex 并在之后恢复它。对于一个 Combobox,没问题,但对于数十个 ...

有没有其他方法可以在重新填充组合框后保留最后一个选中项?

【问题讨论】:

在填充组合框之前获取所选项目。然后填充comboxbox并将选中的项设置回原来的;选定的项目。 不,没有。想想看。如果您正在重新填充 DataTable,那么之前选择的项目不再存在,那么它怎么可能仍然被选择?如果您希望选择相同的项目,则该项目必须仍然存在,因此不要首先将其删除。如果有新项目要添加,只需添加它们,而不是扔掉已有的。 如果所有 ComboBox 控件都绑定到同一个数据源,则更改 Current,您的数据源指向的数据行。所有绑定的控件都将反映新的位置。 @jdweng 是的,这就是我现在正在做的事情。同时我也在思考,这将是唯一的方法。 @jmcilhinney:不,这些项目仍然存在,只是可以添加一个。插入直接在底层 SQL DB 中进行。这就是为什么我必须“更新”组合框。重点是,我没有将 DataTableManagers 用于查找表(因为在这种情况下,生成了大量代码)。这就是为什么我在 thd DB 中添加项目然后重新填充 Combobox 的原因。无论如何,我认为问题已经解决了。谢谢! 【参考方案1】:

如果项目不会从您的组合列表中删除,将表适配器的 Clearbeforfill 属性设置为 False 可以防止这种情况发生。

【讨论】:

Combobox 未绑定到表适配器,因此,这无济于事。

以上是关于绑定组合框在(重新)填充数据源时更改 SelectedItem的主要内容,如果未能解决你的问题,请参考以下文章

自动填充组合框 ExtJS

在 DataTable 更改 WPF 后更新绑定到 DataTable 的 DataGrid

RowDetailsTemplate 中的组合框在选定列之前更新所有内容

在集合中的第二级更改后重新渲染 ng-options

带有 javascript 值的组合框在 iPad 上不起作用

使用工具提示 WPF 在数据网格中填充组合框