在一个给客户做的项目中,界面要求修改增加通用工具栏按钮的事件处理,也就是在主界面中放置几个固定的功能操作按钮,打开不同的页面的时候,实现对应页面的功能处理,这种和我标准的界面处理方式有所不同,标准的列表界面,一般在界面中放置了一些常规的按钮,如查询/更新,新建,编辑,删除,导入,导出等常规操作,现在是需要把这些提升到主界面的层次上放置按钮,这种处理方式也算是提供一种方便吧。本篇随笔介绍实现这个功能的思路和代码实现逻辑。
这里要实现的通用工具栏按钮的事件处理,具体的界面是这样的,我们处于一个多文档的主界面中,在主界面的顶部工具栏放置这些通用的工具栏按钮,以便提高相关的处理便利和效率。
从上面的界面我们可以看的到,程序主界面的顶部工具栏上有一些常规的操作,包括如查询,新建,编辑,删除,导入,导出等按钮,可以为程序的功能操作提供方便。
当我们打开一个新的窗体页面,那么对应的按钮事件也应该和这个窗体相关,或者我们切换到其他窗体,那么按钮的处理事件也应该跟着变化到对应的窗体上,这种就是我们需要的效果。
上面的逻辑也就是我们新建一个窗体,或者切换一个窗体,那么需要通知顶部工具栏进行更新或者进行一个对接的处理才可以。
由于我们想尽可能的减少开发的工作量,因此希望在基类进行一些事件或者接口的封装,以便降低新建列表窗体的时候的代码编写。
对于一个如查询操作的处理事件,我们需要定义一个接口来实现这个功能,这样我们才可以在打开的窗体的时候,把它转换为对应的接口处理。
例如我们定义一个IMenuAction的接口,以更新事件为例,需要实现三部分的接口,一个是事件定义,一个是判断是否包含更新事件,一个是具体的处理逻辑。
///& lt; summary>///定义菜单中的通用按钮事件///& lt;/summary> 公共接口IMenuAction {///& lt; summary>///更新按钮事件///& lt;/summary> 事件EventHandler Refresh_MenuEvent;///& lt; summary>///是否包含更新事件///& lt;/summary> bool HasEventRefresh{得到;}///& lt; summary>///更新操作///& lt;/summary> 空白ProcessRefresh(对象发送方,EventArgs e);
对于其他总共6个标准的按钮事件处理,我们也同样一样定义,那么整个IMenuAction的接口定义如下所示。
///& lt; summary>///定义菜单中的通用按钮事件///& lt;/summary> 公共接口IMenuAction {///& lt; summary>///更新按钮事件///& lt;/summary> 事件EventHandler Refresh_MenuEvent;///& lt; summary>///新建按钮事件///& lt;/summary> 事件EventHandler Add_MenuEvent;///& lt; summary>///编辑按钮事件///& lt;/summary> 事件EventHandler Edit_MenuEvent;///& lt; summary>///删除按钮事件///& lt;/summary> 事件EventHandler Delete_MenuEvent;///& lt; summary>///导入按钮事件///& lt;/summary> 事件EventHandler Import_MenuEvent;///& lt; summary>///导出按钮事件///& lt;/summary> 事件EventHandler Export_MenuEvent;///& lt; summary>///是否包含更新事件///& lt;/summary> bool HasEventRefresh{得到;}///& lt; summary>///是否包含增加事件///& lt;/summary> bool HasEventAdd{得到;}///& lt; summary>///是否包含编辑事件///& lt;/summary> bool HasEventEdit{得到;}///& lt; summary>///是否包含删除事件///& lt;/summary> bool HasEventDelete{得到;}///& lt; summary>///是否包含导入事件///& lt;/summary> bool HasEventImport{得到;}///& lt; summary>///是否包含导出事件///& lt;/summary> bool HasEventExport{得到;}///& lt; summary>///更新操作///& lt;/summary> 空白ProcessRefresh(对象发送方,EventArgs e);///& lt; summary>///增加操作///& lt;/summary> 空白ProcessAdd(对象发送方,EventArgs e);///& lt; summary>///编辑操作///& lt;/summary> 空白ProcessEdit(对象发送方,EventArgs e);///& lt; summary>///删除操作///& lt;/summary> 空白ProcessDelete(对象发送方,EventArgs e);///& lt; summary>///导入操作///& lt;/summary> 空白ProcessImport(对象发送方,EventArgs e);///& lt; summary>///导出操作///& lt;/summary> 空白ProcessExport(对象发送方,EventArgs e); }
那么对于列表界面的基类窗体,我们除了让他继承自XtraForm这个标准的窗体外,我们还让它实现对应的IMenuAction接口,如下是列表界面基类BaseDock的窗体定义。