争怎路由网/网站教程/内容

构建可扩展的体系架构 (续)-zt(5)over

网站教程2024-07-11 阅读
ESTD 也可以确认存在数据集中的数据,例如当用户完成每个控件或每行数据时。在你改变数据时,DataTable的事件ColumnChanging、ColumnChanged、RowChanging和RowChanged就被引发了。如果你是在ESTD而不是UI本身中处理这些事件,你可以在运用ESTD的任何地方进行一致性的确认。如果在ColumnChanging事件中引发了一个错误,而且你用的是Windows Forms,用户将陷入困境。所以用这种方法时要小心——它意味着数据层在命令UI的行为。
你可能想从强类型的数据集里的DataRow类派生,并重载属性以提供确认。这么做不行,因为你不能阻止UI程序员绕过你的属性,直接访问表。
正如Andrew J.Brust和Bill Wagner在他们的文章中讲述的,每个控件有一个DataBindings集,里面包含成对的控件属性/数据元素(见资源)。你可以捆绑到任何控件的任何属性。属性表(grid)提供了普通的绑定, 如Text属性。ESTD继承了一个强类型的数据集,所以你可以在设计时直接进行捆绑。
在设计时进行数据绑定有些缺陷,所以一般你想在代码中指派你的绑定(见列表3)。如果你在设计时继承了一个窗体,该窗体包含在属性表里设置的数据绑定,那么当你在设计器中打开你派生的窗体时,就会出现一个错误,因为你试图将你的控件捆绑到设计器中不存在的数据。这是因为基本窗体在设计器中被实例化了,而且基本窗体在设计时的属性是在一个由它的构造器调用的程序中设置的。
而且,打开Windows Forms无论如何不会很快。通常,你可以打开窗体,收集一些用来读取数据的信息,然后读取数据。这就形成了一个更直接的用户界面。在可下载的程序中就用了这个方法,它使你可以更容易地研究代码(见列表3,数据绑定窗体的改进版本)。
管理你的 CurrencyManagers
绑定数据的定位是由从BindingManagerBase派生的CurrencyManager来处理的。 窗体在它的BindingContext 属性中有一个或多个currency managers。单个控件的BindingContext(除了容器控件外)只是指明容器的BindingContext。如果你定义了一个数据绑定,系统检查在容器(通常是窗体)的BindingContext中的currency manager,如果需要,就创建它。这会导致失败,因为稍微不同的定义都会产生一个另外的currency manager,而且绑定到不同curency manager的项目不能自动地同步。如果你不想让特殊的控件同步,就用一个DataView来强行生成一个新的currency manager,而不用重新指定BindingContext。
你不能给一个属性进行多个绑定,否则会产生运行异常。运用AddBinging方法来防止由于不留心在属性表里设置了绑定而产生的运行异常。
一个组合框将currency managers用于它的内容和当前选项。如果这两个currency managers是一样的,对组合框中的项目进行选择就是重新定位了数据,并且使绑定到那个currency manager的其它控件同步。所附程序中的cboPos 组合框说明了这种方法,而cboCountry 组合框说明了对两种不同的currency managers的更普通的用法。



所附程序中包含一个toolbar, 带有一个更新的VB6 DataControl的用户界面。 Toolbar的ButtonClick事件显示了用ESTD进行加载和保存是多么简单。它也显示了如何明确地得到currency manager并用它来控制它在底层DataTable或DataView中的位置。 你可以根据用来创建currency manager的值从BindingContext中得到它,但是任何改变都会形成一个新的currency manager,使你的引用变得没用了。如果你从一个绑定控件的DataBindings集里直接得到currency manager,会更加可靠:
cm = txtCompanyName. _ DataBindings("Text").BindingManagerBase


……

相关阅读