ComboBox 或 ListBox 作为表单的索引 - 将其他控件绑定到 SelectedItem

4
这实际上是一个非常简单和基础的问题,如果这是一个重复的问题(肯定是),请原谅我,但我无法在任何地方找到直接的答案,最终放弃了。我在Visual Studio '17中创建了一个Windows Forms应用程序,基于SQL服务器表创建了数据源,并添加了一个绑定的组合框。到目前为止都很好。使用DataSource/DataSet面板中的拖放功能,我填充了一些文本框中的字段并绑定到数据。使用自动添加的数据绑定导航器,我可以滚动表格并且所有控件都会更新,所以我知道它们都已正确绑定。
现在,我想要做的就是当组合框选定值更改时更新控件。但是他们没有。从我所读到的内容来看,我猜测某种方式需要让组合框警报数据源当前记录需要更新?如果是这样,我该如何将其更新为组合框的键值?或者也许这完全是错误的?我的希望是,对于绑定的控件,VS会进行其魔法,以便我不必处理每个组合框更改事件,查询数据库,然后更新每个控件。
我认为这将是一个简单的任务;鉴于它非常基础,肯定会有简单明了的解释,但是要么讨论的问题更加复杂,要么就会讨论一堆数据绑定过程和对象。这是我的平时.NET和SQL编码之外的一个副业,所以我希望只需要一个或两个简单的事件处理程序即可。

1
尝试阅读Brian Noyes的经典著作《使用Windows Forms 2.0进行数据绑定》,这应该会有所帮助... - Dean Kuga
谢谢您的建议,我相信这本书非常全面。然而,时间不允许我深入研究 .net 数据绑定的方方面面。但我的观点是,我不应该为了使开箱即用的功能正常工作而深入框架,尤其是对于如此简单的事情。(虽然这不是第一次!) - Jamesckel
1个回答

2
当您想设置列表控件(如ComboBoxListBox)作为数据的索引时:
  • 将其DataSource属性设置为其他控件绑定的相同DataSource
  • 将其DisplayMember设置为在组合框中显示,但您不需要设置ValueMember
  • 不要更改(DataBindings)。您不需要设置数据绑定。

示例

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

  • idTextBox → 数据绑定:Text属性绑定到productsBindingSourceId属性
  • nameTextBox → 数据绑定:Name属性绑定到productsBindingSourceName属性
  • priceTextBox → 数据绑定:Price属性绑定到productsBindingSourcePrice属性

然后,要使ComboBox作为索引,请使用以下设置:

  • DataSource属性设置为productsBindingSource
  • DisplayMember属性设置为Name
  • 不要更改(DataBindings)。您不需要设置数据绑定。

然后,当您从ComboBox中选择项目时,绑定的控件将显示所选项目,绑定导航器也会移动:

enter image description here


Reza,谢谢,我已经让它工作了。我改变的唯一设置是组合框“ValueMember”(设置为空字符串),这是关键,显然。如果填充,则不会更新表单,如果为空,则会更新。我知道必须有一个简单的答案,因为所有绑定和导航功能已经存在。 - Jamesckel
不客气 :). 关于 ValueMember → 你不需要设置它。只需设置 DisplayMember 就足以使其工作。关于 (DataBindings) → 你不需要设置它们,不是因为设置已经存在,而是因为你真的不需要为列表控件设置数据绑定。实际上,如果你设置了 ValueMember,你将面临验证问题。我在答案中提到的是使列表控件作为索引工作所需的最小设置。你在 gif 图像中看到的 ComboBox 是基于我在帖子中分享的步骤创建的。 - Reza Aghaei
实际上,回到这个问题,你确实需要将“ValueMember”设置为键字段,通常是一些你不想显示但需要作为数据集中选择行的基础的“ID”字段。我发现如果没有设置这个,组合框中的数据列表会迅速损坏。 - Jamesckel
@user3091705 我再次仔细检查了一切。我可以再次确认,如果一个 ComboBox 只是作为索引,你不需要设置 ValueMember。就像我分享的 gif 动画中所看到的那样。但是据我所见,设置 ValueMember 是无害的。 - Reza Aghaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接