桌面应用C#框架

在企业应用开发中,通常需要大量的窗体来执行不同的功能。在不同的窗体上堆放大量的控件来表述不同的数据。

而所实现的功能就是提供用户界面供用户操作数据库。而其中的所有业务逻辑实际上完全可以通过存储过程来实现,而不在应用程序中做业务逻辑的处理。

这样的话,万一要修改业务逻辑的话,可以很方便的在服务器上实施,而不用考虑到下面各个已经部署的应用的更新。

同时在客户端上只部署一个应用引擎,而并没有任何和具体业务应用相关的代码。这样的话。UI相关的东西整体打包成一个配置文件放在服务器上(配件文件不大,只有3、4百K左右),每次用户登录的时候,从服务器上DownLoad这个配置文件,如果要做什么UI界面相关的更改的话,也直接在服务器上修改即可完成部署。

有点类似浏览器的BS架构。

 

而实际上,大部分的窗体上甚至大部分的控件都完成类似的功能。

1、呈现数据给用户。

2、提供用户修改或者输入的功能。

而用得最多的控件,无外乎如下几种:

TextBox, Label, ComboBox, DataGridView,CheckBox,TreeView,Button等

而上述几种控件,像TextBox,ComboBox前面通常还需要一个Label控件以指示该TextBox中的内容含义。

而DataGridView则用于绑定数据源,显示数据,编辑数据等操作。

而如果每个界面都采用系统原有的控件进行堆砌,则如果要改变某一类控件的功能,则需要修改所有UI窗体中该控件的代码。

最简单的例子可能是对于回车键的处理。通常为了方便用户的输入,在TextBox,ComboBox等控件中。当用户输入回车键的时候

需要将焦点切换到下一个控件。而为了到达这个功能,可能需要去修改所有的UI窗体的所有TextBox控件。这个不得不说是个很大的工程。

因此,基于上面最简单的想法。自己对上面的控件进行封装。自己定义一套“控件”。

但是,通常的自定义控件开发过程和处理消息等都很复杂。因此,自己封装了一套轻量级的“控件”。

至于这里为什么说是轻量级的“控件”,后面再描述解释。

控件包括:

Button,CheckBox,ComboBox,DateTimePicker,TextBox,Extend TextBox,Edit List,Group,Label,List,Multi TextBox, Picture, Radio,Tree View,TreeList, BatchList

分别完成不同的功能。且这样出来的控件风格统一,修改或者扩展功能方便实施。

下面这个是从工程中实际的截图出来的。

整个界面的布局以及每个控件后面的功能则由配置文件来描述。例如上面的这个窗体的布局以及业务逻辑配置脚本如下:

 

[ADDWEIXIU]
CAPTION=机头维修单登记;WIDTH=550;HEIGHT=475;FUNC=1021
CONTROLS=20
1=pry.CMyGroupBox<LABEL=机头维修信息;Left=10;Top=6;WIDTH=524;HEIGHT=413>
2=pry.CMyEditEx<DEFAULT=1;LABEL=客户名称:;Left=80;Top=31;WIDTH=151;HEIGHT=15;MUSTGIVE=1;ONLEAVE=UPDATE(BOSS),1,-1:UPDATE(TEL),-1,-1;TAG=CUSTOM;SELCAPTION=选择客户;SELWIDTH=500;SELHEIGHT=500;SELSQL=SELECT Custom.sName as Custom$SNAME,Custom.sCode as Custom$SCODE,Custom.sFullName as Custom$sFullName,n.sName AS Custom$sNetwork FROM tbl_Custom as Custom,tbl_Network n where Custom.iNetwork=n.ID AND iNetwork=#NETWORKID;FILTER=Custom$sCode like '%#CUSTOM%' or Custom$sName like '%#CUSTOM%'>
3=pry.CMyEdit<LABEL=客户老板:;Left=339;Top=31;WIDTH=184;HEIGHT=20;READONLY=1;TAG=BOSS;UPDATEVALUE=EXESQLSELECT sBoss FROM tbl_Custom WHERE sName='#CUSTOM'>
4=pry.CMyEdit<LABEL=联系电话:;Left=80;Top=74;WIDTH=183;HEIGHT=20;READONLY=1;TAG=TEL;UPDATEVALUE=EXESQLSELECT sTEL FROM tbl_Custom WHERE sName='#CUSTOM'>
5=pry.CMyEditEx<DEFAULT=1;LABEL=物料编码:;Left=339;Top=74;WIDTH=152;HEIGHT=20;READONLY=0;ONLEAVE=UPDATE(WNAME),1,-1:UPDATE(XING),2,-1:UPDATE(COLOR),-1,-1;MUSTGIVE=1;TAG=WID;SELCAPTION=选择物料;SELWIDTH=650;SELHEIGHT=500;SELSQL=SELECT ltrim(rtrim(wid)) as Goods$ID,ltrim(rtrim(wna)) as Goods$sName,ltrim(rtrim(sirno))   as  Goods$sirno,color as Goods$sColor,ltrim(rtrim(Jname)) as Vender$Jname,ltrim(rtrim(unit)) as Goods$sPackets FROM Material,Vender where Material.vid = vender.vid;FIXFILTER=(LEN(TRIM(Goods$ID))=10 OR LEN(TRIM(Goods$ID))=9);FILTER=Goods$ID LIKE '%#WID%' or Goods$sName like '%#WID%'>
6=pry.CMyEdit<LABEL=物料名称:;Left=80;Top=119;WIDTH=183;HEIGHT=17;READONLY=1;TAG=WNAME;UPDATEVALUE=EXESQLSELECT LTRIM(RTRIM(wna)) FROM Material WHERE LTRIM(RTRIM(wid))='#WID'>
7=pry.CMyEdit<LABEL=机型:;Left=339;Top=119;WIDTH=185;HEIGHT=20;READONLY=1;TAG=XING;UPDATEVALUE=EXESQLSELECT LTRIM(RTRIM(sirno)) FROM Material WHERE LTRIM(RTRIM(wid))='#WID'>
8=pry.CMyEdit<LABEL=颜色:;Left=80;Top=168;WIDTH=183;HEIGHT=20;READONLY=1;TAG=COLOR;UPDATEVALUE=EXESQLSELECT LTRIM(RTRIM(color)) FROM Material WHERE LTRIM(RTRIM(wid))='#WID'>
9=pry.CMyEdit<LABEL=机头IMEI:;LENGTH=15;Left=339;Top=168;WIDTH=185;HEIGHT=20;MUSTGIVE=1;TAG=IMEI;ONLEAVE=UPDATE(REGDATE),-1,-1>
10=pry.CMyEdit<LABEL=购机时间:;Left=80;Top=211;WIDTH=182;HEIGHT=20;READONLY=1;TAG=REGDATE;UPDATEVALUE=IMEIREG(#IMEI)>
11=pry.CMyCombox<LABEL=是否过保:;Left=339;Top=211;WIDTH=185;HEIGHT=20;READONLY=1;TAG=AFTER;DEFAULT=1;ITEMS=已过保,未过保>
12=pry.CMyEditEx<LABEL=故障类型:;Left=80;Top=251;WIDTH=151;HEIGHT=20;MUSTGIVE=1;TAG=FAILTYPE;DEFAULT=1;SELCAPTION=选择故障类型;SELWIDTH=500;SELHEIGHT=500;SELSQL=SELECT sName as FailType$SNAME,sCode as FailType$SCODE,sComment as FailType$sComment FROM tbl_XXXXXXXX;FILTER=FailType$sName like '%#FAILTYPE%' or FailType$sCOde like '%#FAILTYPE%'>
13=pry.CMyEdit<LABEL=故障描述:;Left=339;Top=253;WIDTH=183;HEIGHT=20;TAG=FDESC>
14=pry.CMyEdit<LABEL=受理单号:;Left=80;Top=296;WIDTH=184;HEIGHT=20;MUSTGIVE=1;TAG=DAN>
15=pry.CMyCombox<DEFAULT=1;LABEL=维修方法:;Left=339;Top=294;WIDTH=184;HEIGHT=19;TAG=METHOD;READONLY=1;ITEMS=换新,报价换新,保修,报价维修,入网机换新,入网机报价换新,入网机保修,入网机报价维修;MUSTGIVE=1>
16=pry.CMyMultEdit<LABEL=备注:;Left=80;Top=334;WIDTH=408;HEIGHT=20;TAG=COMMENT>
17=pry.CMyButton<LABEL=进入发货;FUNC=1031;Left=20;Top=372;WIDTH=69;HEIGHT=35;ACTION=FORM(ADDWEIXIUUPSEND),-1,-1>
18=pry.CMyLabel<LABEL=请在登记完所有的机头后再点此按钮进行发货;Left=91;Top=384;WIDTH=2;HEIGHT=2;FONT=11;MUSTGIVE=1>
19=pry.CMyButton<LABEL=保存;FUNC=1021;Left=418;Top=375;WIDTH=48;HEIGHT=35;ACTION=EXESP(sp_AddWeiXiu @psCustom=#CUSTOM,@pswid=#WID,@psIMEI=#IMEI,@psBuyDate=#REGDATE,@psAfterAssurance=#AFTER,@psFailType=#FAILTYPE,@psFDesc=#FDESC,@psDan=#DAN,@psMethod=#METHOD,@psComment=#COMMENT),1,-1:INFO(555),-1,-1:BACK(),-1,-1>
20=pry.CMyButton<LABEL=退出;Left=479;Top=375;WIDTH=48;HEIGHT=35;ACTION=BACK(),-1,-1>

上面的布局配置文件实现这个界面的所有功能和限制。

系统根据上面的这个配置脚本,在运行的时候动态生成一个窗体呈现给用户。

后面其他的会介绍每个控件的功能和实现方式。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值