数据绑定与UI控件:使用ObjectDataSource

在现代应用程序开发中,数据绑定是一个重要的概念,它允许开发者将用户界面(UI)元素与数据模型进行连接。在本文中,将探讨如何使用ObjectDataSource来实现数据绑定,并通过一个名为PurchaseOrderForm的文档表单示例,展示如何将UI控件与数据对象进行绑定。

ObjectDataSource简介

ObjectDataSource是一个强大的数据绑定组件,它允许将UI元素与对象的属性进行绑定。在文档表单PurchaseOrderForm中,将使用ObjectDataSource来绑定UI与底层的PurchaseOrder实例。任何对绑定对象的更改都会自动更新到UI中,用户所做的更改也会自动反映到底层的PurchaseOrder中。

定义ObjectDataSource

要开始使用ObjectDataSource,首先需要定义它。Visual Studio提供了一个非常方便的数据源工具面板,通过这个面板可以轻松地添加数据源。如果还没有打开数据源工具面板,可以通过菜单栏的“视图”->“其他窗口”->“数据源”来打开它。

点击“添加数据源”按钮,会出现一个对话框。选择“对象”,然后点击“下一步”。接下来,展开项目名称,例如“MDICaseStudyPurchasing”,再展开“ObjectBase”,并勾选“PurchaseOrder”,然后点击“完成”。这样就会在数据源面板中添加一个由PurchaseOrder类定义的数据源。

创建数据绑定控件

现在,已经在数据源面板中有了PurchaseOrder的数据源。可以将面板中的属性拖放到表单上,以创建数据绑定控件。首先,需要从表单中删除RichTextBox,并移除与之相关的TextChanged事件处理程序,以及从PurchaseOrder构造函数中设置其文本的代码。

public PurchaseOrderForm(PurchaseOrder purchaseOrder) { // ... InitializeComponent(); purchaseOrderBindingSource.DataSource = _purchaseOrder; purchaseOrderBindingSource.ResetBindings(false); }

接下来,将添加一个数据绑定控件来绑定PurchaseOrderNumber属性。在数据源面板中,属性旁边的图标会告诉拖动到表单上时会创建什么类型的控件。PurchaseOrderNumber已经默认为TextBox,这正是想要的,但可以通过点击属性旁边的下拉菜单来选择不同的控件类型。

更新数据源

默认的绑定类型是OnValidation,这意味着数据源只有在控件通过验证后才更新。由于TextBox在失去焦点之前不会通过验证,所以数据源不会更新,除非强制它更新。可以通过双击TextBox来创建一个事件处理程序,手动更新数据源,以确保用户输入的最新数据被更新到数据对象中。

private void purchaseOrderNumberTextBox_TextChanged(object sender, EventArgs e) { foreach (Binding b in purchaseOrderNumberTextBox.DataBindings) { b.WriteValue(); } }

设置数据源

最后,需要将底层的PurchaseOrder实例设置为BindingSource的数据源。在PurchaseOrderForm的构造函数中,调用InitializeComponent()后,添加以下代码:

public PurchaseOrderForm() { // ... InitializeComponent(); purchaseOrderBindingSource.DataSource = _purchaseOrder; purcahseOrderBindingSource.ResetBindings(false); } public PurchaseOrderForm(PurchaseOrder purchaseOrder) { // ... InitializeComponent(); purchaseOrderBindingSource.DataSource = _purchaseOrder; purchaseOrderBindingSource.ResetBindings(false); }

ResetBindings(false)将导致所有使用此绑定源的控件更新其显示的值,重新从底层对象源读取数据。指定false告诉BindingSource,数据模型的架构没有改变。

更新UI控件

每当底层的PurchaseOrder发生变化时,希望BindingSource更新所有绑定的控件。因此,去到purchaseOrder_Changed事件处理程序,在用OnChanged(e)“冒泡”事件之前,添加一行代码来重置绑定。现在事件处理程序应该看起来像这样:

private void purchaseOrder_Changed(object sender, PurchaseOrderChangedEventArgs e) { purchaseOrderBindingSource.ResetBindings(false); OnChanged(e); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485