【问题标题】:ComboBox or ListBox as index of Form - Bind other controls to SelectedItemComboBox 或 ListBox 作为 Form 的索引 - 将其他控件绑定到 SelectedItem
【发布时间】:2019-04-16 17:13:24
【问题描述】:

这实际上是一个非常简单和基本的问题,如果这是一个重复的问题,我很抱歉(肯定是这样),但我无法在任何地方找到一个直截了当的答案,我终于认输了。

我在 Visual Studio '17 中创建了一个 Windows 窗体应用程序,创建了一个基于 SQL 服务器表的数据源,并添加了一个绑定的组合框。到目前为止,一切都很好。使用 DataSource/DataSet 面板中的拖放功能,我在文本框中填充了一些字段并绑定到数据。使用自动添加的数据绑定导航器,我可以滚动表格并且控件全部更新,因此我知道它们都已正确绑定。

现在,我想要完成的就是在组合框选定值更改时更新控件。但他们没有。根据我的阅读,我猜想组合框需要以某种方式提醒数据源当前记录需要更新?如果是这样,我如何让它从组合框中更新为键值?或者这可能是完全错误的?我希望 VS 能够为绑定控件发挥它的魔力,这样我就不必处理每个组合更改事件、查询数据库,然后更新每个控件。

我认为这将是一项简单的任务;鉴于它非常基础,肯定会有直截了当的解释,但要么讨论的问题更复杂,要么讨论数据绑定过程和对象的迷宫。这有点像我通常的 .net 和 SQL 编码的副业,所以我希望只需要一个或两个简单的事件处理程序。

【问题讨论】:

  • 尝试阅读 Brian Noyes 的经典“Windows Forms 2.0 的数据绑定”,这应该会有所帮助...
  • 感谢您的建议,我相信这本书非常详尽。但是,时间不允许我研究 .net 数据绑定的来龙去脉。但我的重点是,我不应该为了让开箱即用的功能正常工作而深入框架,尤其是对于非常简单的事情。 (虽然这不是第一次!)

标签: c# .net winforms data-binding combobox


【解决方案1】:

当您想设置像ComboBoxListBox 这样的列表控件来充当数据的索引时:

  • 将其DataSource 属性设置为与绑定其他控件相同的DataSource
  • 将其DisplayMember 设置为显示在组合框中,但您不需要设置ValueMember
  • 请勿触摸 (DataBindings)。您无需设置数据绑定。

示例

假设你有一个productsBindingSource,这些是绑定控件的设置:

  • idTextBox → 数据绑定:Text 属性绑定到Id productsBindingSource 的属性
  • nameTextBox → 数据绑定:Name 属性绑定到 Name productsBindingSource 的属性
  • priceTextBox → 数据绑定:Price 属性绑定到 Price 属性 productsBindingSource

然后有一个ComboBox作为索引,这些是ComboBox的设置:

  • DataSource 属性设置为 productsBindingSource
  • DisplayMember 属性设置为 Name
  • 请勿触摸 (DataBindings)。您无需设置数据绑定。

结果,当你从ComboBox中选择一个项目时,绑定的控件将显示选定的项目,绑定导航器也会移动:

【讨论】:

  • Reza,谢谢,我搞定了。我更改的唯一设置是组合框“ValueMember”(设置为空字符串),显然这是关键。如果填充,它不会更新表单,如果为空,它会更新。我知道必须有一个简单的答案,因为所有绑定和导航功能都已经存在。
  • 不客气 :)。关于ValueMember → 不需要设置。设置DisplayMember 就足够了。关于(DataBindings) → 你不需要设置它们,不是因为设置在那里,因为你真的不需要为列表控件设置数据绑定。事实上,如果您设置ValueMember,您将面临验证问题。我在答案中提到的是使列表控件用作索引所需的最少设置。您在 gif 图像中看到的 ComboBox 是根据我在帖子中分享的步骤创建的。
  • 其实回过头来,你确实需要将“ValueMember”设置为关键字段,这通常是一些你不想显示的“ID”字段,但这需要成为从数据集中选择行的基础。我发现如果没有这个设置,组合框中的数据列表会迅速损坏。
  • @user3091705 我再次仔细检查了所有内容。我可以再次确认您不需要为仅充当索引的ComboBox 设置ValueMember。就像你在我分享的 gif 动画中看到的一样。但据我所知,设置ValueMember 是无害的。
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2010-12-26
  • 2011-01-02
  • 2021-10-18
相关资源
最近更新 更多