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

Posted

技术标签:

【中文标题】如何将绑定连接到(Winform)ComboBox 控件以从绑定源获取/设置控件中的选择?【英文标题】:How do I connect a binding to a (Winform) ComboBox control to get/set the selection in the control from the binding source? 【发布时间】:2021-09-20 06:13:34 【问题描述】:

我已经深入我的 google-fu 寻找答案。

首先,我不只是询问如何将组合框绑定到数据源。除非我有严重的理解差距,否则它不止于此。

在我的 Winform 上,左侧有一个 DataGridview,右侧有一个面板,其中包含左侧所选行的值。右侧的控件之一是我遇到问题的 ComboBox。我设置了绑定源和数据视图,右侧的其他控件运行良好,除了 ComboBox 控件。

与此 ComboBox 交互的用户应该看到诸如“Item ABC”和“Item EFG”之类的值,与它们相关的值可能是 1234 和 5678。如果这是一个完全未绑定的控件,我会放置一个对象数组中的项目。一旦我让它工作,我会从不同的来源加载它。

但是当我尝试 DataBindings.Add("??", dataview, "dataviewfield", ...) 时,我无法获得“??”的正确值。运行时调试显示“SelectedItem.Value”将是正确的选项,但是当我使用它时会出现“未找到”类型的异常。我也尝试过“SelectedValue”,但是没有用(调试显​​示它是 null 并且抛出不允许 null 的异常)。

如何通过 Binding 将该值直接放入 DataView?

设置 .DataSource 只会丢失项目并且根本没有帮助。

如何做到这一点?没有使 ComboBox 完全解除绑定,直接设置 selectedindex 并在所选索引更改时捕获值 - 不得不这样做似乎很笨重。

-老程序员

进一步说明:我进行了编辑以阐明 ComboBox 的位置。

我已经取得了进步(当然,只有在提出问题后,我的脑海中才会出现新的途径)。我开始想我可能需要一个自定义绑定适配器,所以开始用谷歌搜索。我发现一些样本可以满足我的需求。

最重要的问题是我没有在 ComboBox 上分配数据源,我只是在添加项目。当我创建一个两列数据集和几行(可能是我想的任何内容)并将其设置为 ComboBox 的 displaymember 和 valuemember 时,SelectedValue 是否开始显示一个值(而不是一直为 null)。

我认为这是问题所在。剩下的问题是让左侧在更改后重新显示/刷新。

【问题讨论】:

您已经解释了很多,但仍不清楚您面临的确切问题是什么。如果您分享相关代码并解释如何重现该问题,这将有所帮助...DataBindings.Add("??", dataview, "dataviewfield", ...)不清楚何时执行此代码以及您为什么编写这行代码...请添加一些清晰的细节与问题中的相关代码。 【参考方案1】:

在为 DataGridView 和 bindingsource 加载数据源时,尝试让它们共享同一个列表:

BindingSource1.Datasource = dataset
DataGridView.Datasource = BindingSource1

这应该意味着对 bindingsource 中数据的任何更改也会更新 DataGridView。

要编辑所选对象,只需处理 SelectionChanged 事件并将 BindingSource1.Position 设置为数据源中所选对象的索引。

【讨论】:

我认为这个响应的方向是错误的。组合框位于依赖的“表单”(右面板)上。我能够让它工作,只是在右侧进行更改后刷新左侧有点困难(事件似乎都在错误的时间触发)。

以上是关于如何将绑定连接到(Winform)ComboBox 控件以从绑定源获取/设置控件中的选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表绑定到组合框?

c#winform中一个combobox的datasource绑定给另一个combobox

winform中的ListBox和ComboBox绑定数据用法实例

C# - 如何检查用户的输入是不是存在于组合框中(使用的数据绑定项)

数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化

C# winform 编程下ComboBox 怎么给他绑定三个值?