看了很多的回复,谢谢大家的关注!

今天我想写个例子,简单说下如何使用这个框架开始新的项目并实现一个典型的CRUD功能。期间我还想说说关于各种UI组件间信息交互和调度方面的问题。这个组件一直在修修补补,基本稳定后也没有真正的仔细考虑过是否有更好的实现方式,通过简单的说明希望能把我的思路也理理清楚。大家也多多拍砖。

开始一个新的项目,首先要做的是创建一个主窗体,它直接从WorkbenchBase继承即可。

Partial Class MainForm

Inherits Component.WorkbenchBase

…………….

End Class

完成上面代码后,就可以得到下图这样一个具备基本的菜单、手风琴和用户组件区的窗体。

由于业务功能没有具体实现,所以手风琴菜单什么都没有。而主菜单中除了与业务动作紧密关联的“编辑”菜单外,其他菜单项WorkbenchBase以默认提供。

主窗体有了以后,我们可以在实现一个典型的CRUD功能。

上一篇中以提到,实体编辑组件(EntityControl)用于处理一个业务实体的用户交互界面,一次做CRUD功能首先要创建一个自定义控件,然后修改代码,让他继承自EntityControl。

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Public Class MyEntityContorl

Inherits Component.EntityControl

…………….

End Class

而后需要把实体中的字段控件逐个定义到这个控件上,如下图

需要注意的是,为了能够完成组件与业务实体自动进行赋值和取值,要为需要进行数据交互的控件的Tag属性填写上相应的实体属性名。

如果实体组件上有需要数据绑定的组件,比如Combobox等,则重写InitBindableControl方法,把绑定的具体实现再在该方法内。

Public Class MyEntityContorl

''' <summary>

''' 实现可绑定组件的绑定方法

''' </summary>

''' <remarks></remarks>

Public Overrides Sub InitBindableControl()

MyBase.InitBindableControl()

End Sub

End Class

实体组件通过反射调用相应的方法完成CRUD操作,默认方法名新增为“INSERT”,删除为“DELETE”,修改为“UPDATE”。如果需要变更相应方法名可以改写下面的属性。

Public Overrides ReadOnly Property InsertMethodName() As String

Get

Return MyBase.InsertMethodName

End Get

End Property

Public Overrides ReadOnly Property UpdateMethodName() As String

Get

Return MyBase.UpdateMethodName

End Get

End Property

Public Overrides ReadOnly Property DeleteMethodName() As String

Get

Return MyBase.DeleteMethodName

End Get

End Property

如果实体控件还需要提供额外的业务操作(如审核等),自己新增相应的方法即可。

此时的用户编辑组件并不知道他要编辑的业务实体对象是什么,由于大部分的CRUD操作在网格组件(GridView)中发起,此类场景下GridView会自动为用户编辑组件的DataSource赋值。在少数场景下,如果一个用户编辑组件需要独立使用,则需要自己编码为用户编辑组件设置DataSource和State(新增、修改、删除等状态)属性,以便用户编辑组件能够知道他要处理的实体对象和处理方法。如下面的代码:

entityControlHost.State = New EntityControlHostAddNewState()

entityControlHost.EntityControl.DataSource = r

到此为止一个实体编辑组件就完成了,他已经具备的与业务实体进行数据交互,CRUD的业务动作的自动调度等功能。由于重点在UI框架的介绍,具体CRUD的实现过程不再说明。

实际应用中,一个程序的界面组织形式有可能有两种显示方式:MDI和SDI。框架通过LayoutBehavier同时支持这两种方式,但是有些我们遇到的系统中的某些功能只能以MDI形式展现,由此可能造成有些SDI显示正常的组件在MDI中显示异常,因此我们需要为每个实体编辑组件定义一个容器,这个容器一方面可以提供SDI和MDI的支持,另外可以实现命令按钮,业务调度与实体编辑组件松耦合,避免重用的局限性。实体编辑组件的容器分为两类:EntityTabbedHost和EntityDialogHost,分被对应MDI和SDI。其中EntityDialogHost可以在MDI和SDI中系统自动甄别使用,EntityTabbedHost只能应用在MDI中。

那么就可以为MyEntityControl定义一个容器,

让这个组件集成EntityDialogHost,得到下面的窗体:

而后把刚才做好的实体编辑组件添加到这个窗体中。

并在代码中填写下面内容

Public Overridable Property EntityControl() As EntityControl Implements IEntityControlHost.EntityControl

Get

Return MyEntityControl1

End Get

Set(ByVal value As EntityControl)

MyEntityControl1 = value

End Set

End Property

此时,一个完整的实体编辑功能做完了。他已具备的保存、删除等基本的命令按钮,并实现了相应的调度功能,如果需要增加额外的业务命令,直接增加按钮并完成相应处理代码即可。

后面我们在做一个这个实体的网格组件,让这个功能更完整。

贴图太费劲了,很简单,我就文字描述了,首先定义一个自定义组件,让这个组件集成GridView,此时获得下面的控件。

使用设计器,添加相应的列,即可完成网格组件的定义。如果实体编辑组件中有额外的业务处理(如审核等),可以把他以菜单项的形式定义在编辑或系统中,后面框架会自动与主菜单合并。以保证框架业务调度和展现的一致性。

此时该组件已具备了网格自定义(列,条件样式等,其实这个很好做都是Janus组件的一个功能集成)及CRUD及其他业务功能的调度能力。

并且他不需要而外定义容易,因为系统会自动根据LayoutBehavier的MDI和SDI状态决定他的展现形式。

至此CRUD的功能都做完了,剩下就是拼装这个功能。

拼装过程原来是参照SharpDeveploer用插件做的,包括依赖关系等,后来感觉开发规模有限,调试也很麻烦就放弃了。

简单说下拼装过程,首先在一个业务功能对应着一个FolderItem,多个FolderItem构成一个Folder,一个Folder对应着主窗体上左侧手风琴菜单的一组。

为了把上面的业务功能增加到系统中,需要以下代码:

Public Class CustomerFolder

Inherits Component.Folder

Public Sub New()

Init()

End Sub

Sub Init()

Dim item As FolderItem

item = New FolderItem

Text = "XXXXX管理"

ImageName = Application.StartupPath + "\images\basedata.bmp"

item.FolderName = "XXXXX管理"

item.FolderOrder = 1

item.FolderGroup = "XXXXX管理"

item.IconName = "small75.bmp"

item.Subject = "XXXXX管理"

item.ViewFullName = "CustomerView"

item.BusinessServiceFullName = "DAL.CustomerProvider"

item.BusinessMethodFullName = "GetAll"

AddFolderItem(item)

End Sub

End Class

而后在MainForm(Workbench)中重写CreateFolders()方法

Public Overrides Function CreateFolders() As Component.FolderKeeper

Dim folders As New Component.CustomerFolder

Dim b As BaseFolder = New BaseFolder

folders.Add(b)

Return folders

End Function

其实上面的信息之前是卸载配置文件或数据库里,那样就代码整洁些,但是可读性会稍差,改成这样也不满意,纠结。

下面完成启动代码,就大功搞成了~

''' <remarks></remarks>

Public Sub Main()

Application.SetCompatibleTextRenderingDefault(False)

Application.EnableVisualStyles()

Dim mainForm As New MainForm

mainForm.BusinessBehavier =  New WcfBusinessBehavier

mainForm.LayoutBehavier =  New TabbedLayoutBehavier

mainForm.ServiceManager = New Component.ServiceManager

mainForm.ServiceManager.ValidateService = New ValidateService

'其他服务和Bevhavier暂时不需要,不写了

System.Windows.Forms.Application.Run(mainForm)

End Sub

当然完美的话很多工作要做,但是基本的功能都说明就可以了。运行一下吧:

最简单的CRUD就这么做了,省去了很多赋值取值的麻烦,界面风格统一了,业务功能一致性有保障而且所有调度功能都不用重复写。

还是那句话,抛砖引玉,欢迎大家用力扔玉,最好是蓝田玉,呵呵。

转载于:https://www.cnblogs.com/winscale/archive/2011/03/10/1980079.html

C/S简易UI框架开发总结(2)相关推荐

  1. 后台UI框架开发(一)

    后台UI框架开发(一) 众所周知,现在的后台管理系统的前端页面基本上都是一个样子-- 那既然,每个后台管理页面的样子都是这样的,那我们能不能设计一个页面,专门写成这个样子,只需要以面向对象的方式去使用 ...

  2. 专刊文章 - Web UI框架引领J2EE新开发模式(代码生成器+手工merge半智能开发)

    前言:随着WEB UI框架(EasyUI/Jquery UI/ExtJS/DWZ)等的逐渐成熟,系统界面逐渐实现统一化,代码生成器也可以生成统一规范的界面!代码生成+手工MERGE半智能开发将是新的趋 ...

  3. ui uview 安卓开发_uni-app UI框架之uview-ui使用教程

    image uviewUI 多平台快速开发的UI框架 uni-app2018年初发布以来,一直蓬勃发展,一派欣欣向荣,社区也是人声鼎沸,众望所归. 因此,uView应运而生,uView的目标是成为un ...

  4. vue3.0 结合element ui 开发后台ui框架

    vue3.0 结合element ui 开发后台ui框架,根据element ui 官网步骤安装出现报错信息,解决方法: 按照element UI官网步骤, 启动vue 3.0项目:npm run s ...

  5. 推荐一款多平台快速开发的前端UI框架 —— uView UI

    本人体验了一遍,风格简约,功能齐全,正是心心念念的前端UI框架 配合uni-app 真正是一款多平台开发的神器!! 强烈推荐!! 官网直达:uView UI 体验链接:uView多平台前端开发UI - ...

  6. 猿团YTFramework UI框架正式发布 提高开发效率

    由猿团开发的全新移动端UI框架:YTFramework UI(以下简称YTF UI)正式推出,即日起,开发者即可在YTF UI 页面进行框架的下载和使用. YTF UI是一款前端UI框架,以rem作为 ...

  7. 告别XML,Android新声明式UI框架《Jetpack Compose入门到精通》最全开发指南

    什么是Jetpack Compose? Jetpack Compose是Android的新声明式UI框架.长期以来, Android 开发人员习惯于使用带有状态视图的xml编写UI,这些状态视图通过逐 ...

  8. ui动效 unity_简易 Unity3D UI 框架

    看见一篇介绍 Unity3D UI 框架编写的文章,并且给出了示例代码.然后去了解了一下.讲道理,示例代码蛮乱的,不知道有一些是不是直接从项目代码拷贝然后简单修改,对于一个简单的框架来说,有很多不必要 ...

  9. 前端工具集合(js框架、ui框架、开发工具...)

    vue3 vue3官网:Vue.js pc端开发ui框架(element-plus):一个 Vue 3 UI 框架 | Element Plus 移动端ui框架(vant):Vant - Mobile ...

最新文章

  1. IBM与思科在融合型基础设施领域实现另一突破
  2. flink 运行一段时间 内存溢出_Flink之运行时环境
  3. 这谁写的技术文档?我想锤死他...
  4. 深入了解SpringCloud Hystrix
  5. javascript --- 防抖与节流
  6. 以太坊钱包开发系列 - 创建钱包账号
  7. Python基础入门6_文件和异常
  8. 虚拟主机安装mysql_如何虚拟主机安装mysql
  9. Qt中对main.cpp的代码解释
  10. python-布尔数据
  11. Mr.J--HTTP学习笔记(一)-- HTTP简要概述
  12. 回调机制在 Android 监听用户界面操作中的体现
  13. 鸿蒙OpenHarmony hi3516开发板,标准系统实现智能门禁
  14. vant中修改用户的头像
  15. mysql 嵌套查询优化_MySQL——优化嵌套查询和分页查询
  16. html控制变量范围,加入控制变量后结果悲催了?!
  17. 16G DWDM SFP+光模块特性及解决方案
  18. Unity3D坦克大战(附代码和原理讲解)
  19. 链改价值节点,构建区块链命运共同体
  20. 前端重要信息手机号、邮箱、身份证号进行脱敏处理

热门文章

  1. JavaScript事件处理的例子:事件捕捉和冒泡 - event capture and bubble
  2. 关于SAP Fiori用户管理资料的一个问题
  3. Kubernetes使用Jenkins服务器存储所有的kube.config文件
  4. 如何在ubuntu上安装virtualbox的driver module vboxdrv
  5. tomcat启动时窗口中出现中文乱码的解决办法
  6. idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...
  7. vnc连接linux颜色灰色,VNC 灰色的屏幕解决方法
  8. 大数据中常见的端口号 总结汇总大全(最新)
  9. 计算机微机原理及接口技术实训室,《微机原理与接口技术》课程实验报告.doc...
  10. python反余弦函数_Python代码中acos()函数有什么功能呢?