在开发WinForms应用程序时,数据绑定是一个常见的需求,但实现这一功能往往伴随着重复的编码工作。本文将介绍两个开发的实用组件,旨在简化这一过程。这些组件并不是遵循任何标准设计模式,但它们可以帮助开发者避免在实现简单绑定场景时的重复编码。
本文介绍的组件使用了以下三个开源实现:
要感谢这些宝贵的框架和库,正是通过集成它们,才得以实现本文中描述的小工具组件。
如果曾经开发过带有数据绑定功能的WinForms应用程序,可能会对实现这一功能感到头疼。在构建比演示测试应用程序更复杂的应用时,实现保存和删除数据的重复方法以及错误处理是一个乏味且容易出错的过程。在对数据绑定进行了一些实验之后,开发了两个实用组件:
这是一个具有用户界面的组件,因此可以通过使用Windows表单设计器的工具箱来创建新实例。要将控件添加到工具箱,请选择工具箱的上下文菜单中的“选择项目”,然后浏览到附加项目的编译库(DataBinder.dll)。将控件添加到Windows表单后,可以调用StartProgress和StopProgress方法来显示和隐藏进度条。
以下是使用数据绑定器的示例代码:
VB
'
It will display the progress bar
databinder1.StartProgress()
'
It will hide the progress bar
databinder1.StopProgress()
C#
//
It will display the progress bar
databinder1.StartProgress();
//
It will hide the progress bar
databinder1.StopProgress();
要将控件绑定到实现ICollection的IList的任何数据源,请使用以下语法:
VB
'
This must be NHibernate session, an instance of ISession
DataBinder1.DAOObject = session
'
This is type of entity that needs to be persisted
DataBinder1.EntityType = GetType(User)
'
It contains any collection of entities
DataBinder1.DataSource = objectList
datagrid1.DataSource = DataBinder1.BindSource
'
This will enable data binding between
'
UI controls and internal ObjectView instance
DataBinder1.SetBinding()
'
This will enable the notification window
'
for and save and delete operation
DataBinder1.ShowNotification=True
C#
//
This must be NHibernate session, an instance of ISession
DataBinder1.DAOObject = session;
//
This is type of entity that needs to be persisted
DataBinder1.EntityType = GetType(User);
//
It contains any collection of entities
DataBinder1.DataSource = objectList;
datagrid1.DataSource = DataBinder1.BindSource;
//
This will enable data binding between UI controls
//
and internal ObjectView instance
DataBinder1.SetBinding();
//
This will enable the notification window for and save and delete operation
DataBinder1.ShowNotification=True;
这个组件没有可见的用户界面,因此可以直接像声明任何其他变量一样创建实例。该组件支持泛型声明,因此可以使用任何有效的实体(POCO)来创建DataLoader实例。
以下是使用数据加载器的示例代码:
VB
Dim ldr as New DataUtils.DataLoader(Of User)()
C#
private DataUtils.DataLoader(Of User) ldr = new DataUtils.DataLoader(Of User)();
创建DataLoader实例后,需要订阅事件以捕获一些有用的事件通知,如Cancelled、Finished:
VB
Private Sub ldr_Cancelled()
Handles ldr.Cancelled
MessageBox.Show("Operation cancelled")
DataBinder1.StopProgress()
End Sub
Private Sub ldr_Finished()
Handles ldr.Finished
'Put any data binding code here
userDataBinder.StopProgress()
End Sub
Private Sub ldr_LoadError(ByVal e As System.Exception)
Handles ldr.LoadError
MessageBox.Show(e.Message, "Error")
DataBinder1.StopProgress()
End Sub
C#
ldr.Cancelled+=new CancelledEventHandler(ldr_Cancelled);
ldr.Finished+=new FinishedEventHandler(ldr_Finished);
ldr.LoadErrod+=new LoadErrorEventHandler(ldr_LoadError);
private void ldr_Cancelled() {
MessageBox.Show("Operation cancelled");
DataBinder1.StopProgress();
}
private void ldr_Finished() {
//Put any data binding code here
userDataBinder.StopProgress();
}
private void ldr_LoadError(System.Exception e) {
MessageBox.Show(e.Message, "Error");
DataBinder1.StopProgress();
}
每个数据加载器实例都需要一个NHibernate会话实例来从持久存储中获取数据。
VB
ldr.Session = session
C#
ldr.Session = session;
最后,调用FetchAll方法,该方法将内部创建一个后台工作者并开始异步获取数据记录。同时,应用程序可以显示一个响应式的UI,或者进行其他任务。一旦数据获取完成,应用程序将根据数据检索操作的结果接收Finished或LoadError事件。
VB
ldr.FetchAll()
C#
ldr.FetchAll();
尽管试图保持本文的质量,但仍然认为本文分享的组件没有遵循任何标准设计模式,可能不足以提供可扩展的解决方案。无论如何,认为它可能对某些人有用,并且可以避免一些重复的编码工作。