成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用IExtendProvider簡(jiǎn)化Entity和UI數(shù)據(jù)交換

開(kāi)發(fā) 開(kāi)發(fā)工具
不管是用DataRow用字典還是用Entity都免不了和UI的數(shù)據(jù)交換,比較傳統(tǒng)且經(jīng)典的做法是在UI上添加2個(gè)方法:UpdateData和UpdateUI。本文將談?wù)劺肐ExtendProvider簡(jiǎn)化Entity和UI數(shù)據(jù)交換

大家知道UpdateData就是將從UI的各個(gè)控件的屬性中讀取數(shù)據(jù),在賦值到實(shí)體的屬性中;UpdateUI就是反過(guò)來(lái),從實(shí)體的屬性中讀取數(shù)據(jù),再賦值給UI的各個(gè)控件的屬性。

先舉個(gè)例子:

  1. public void UpdateUI(TTicketSaleBill ticketSaleBill)  
  2. {  
  3.     ....  
  4. edit_CreatorId.StringValue  = ticketSaleBill.CreatorId;   
  5.     edit_CreateDateTime .DateTime  = ticketSaleBill.CreateDateTime ;   
  6.     edit_ModifierId.StringValue = ticketSaleBill.ModifierId ;   
  7.     edit_ModifyDateTime .DateTime  = ticketSaleBill.ModifyDateTime ;   
  8. }  
  9. public void UpdateData(TTicketSaleBill ticketSaleBill)  
  10. {  
  11. ....      
  12.     if(ticketSaleBill.PersistState == Fx.Common.Data.TPersistState.Added)  
  13.     {  
  14.  ticketSaleBill.CreatorId = this.Context.SecurityCtx.LoginUser.Id ;   
  15.  ticketSaleBill.CreateDateTime = DateTime.Now;   
  16.     }  
  17.     ticketSaleBill.ModifierId = this.Context.SecurityCtx.LoginUser.Id;  
  18.     ticketSaleBill.ModifyDateTime = DateTime.Now;     

如果實(shí)體的屬性數(shù)據(jù)比較少,這么寫(xiě)沒(méi)什么問(wèn)題。但是復(fù)雜的實(shí)體動(dòng)則10幾個(gè)屬性,寫(xiě)起來(lái)看了都怕。因此,有了一個(gè)叫做代碼生成器的東西,可以自動(dòng)生成UI的代碼,省掉了一些體力勞動(dòng)。但是,我們不是僅僅寫(xiě)了一次就ok,有時(shí)還要修改。不小心改了一個(gè)名字忘了點(diǎn)重構(gòu)就直接吐血而亡。況且,那么一大堆的代碼在那里也不是一成不變,有時(shí)候改了類型還得加上強(qiáng)制轉(zhuǎn)換。有時(shí)為了方便,我們還會(huì)建立一個(gè)字典,將UI控件和實(shí)體的屬性對(duì)應(yīng)起來(lái)。

本人也屬于懶人,之前也搞過(guò)用字典映射,但始終覺(jué)得不夠人性化,就總琢磨著怎么給這個(gè)方法來(lái)個(gè)升華。畢竟UI都是這個(gè)東西再怎么生成,多少還是要用到IDE的可視化功能吧,如果能向設(shè)置屬性那樣,設(shè)置哪個(gè)屬性對(duì)應(yīng)哪個(gè)控件是否會(huì)好些?

不要太復(fù)雜,直接輸入實(shí)體屬性的名稱、控件屬性的名稱、是否允許空值、是否只讀對(duì)于數(shù)據(jù)交換來(lái)說(shuō)就夠了吧。要實(shí)現(xiàn)這個(gè)必然要擴(kuò)展原來(lái)那些標(biāo)準(zhǔn)控件,向devExpress那樣的第三方控件學(xué)習(xí),似乎沒(méi)那么干勁自己寫(xiě)。于是就以ToolTip為榜樣,用IExtenderProvider來(lái)實(shí)現(xiàn)所需的功能。

首先定義一個(gè)MappingInfo來(lái)存儲(chǔ)上面說(shuō)到的信息。再來(lái)就是定義一個(gè)對(duì)象(我的叫UIMapper),實(shí)現(xiàn)IExtenderProvider(這一步?jīng)]什么好說(shuō)的了,關(guān)鍵是ProvidePropertyAttribute別設(shè)置錯(cuò)誤,否則啥都擴(kuò)展不出來(lái))。提供2個(gè)方法,UpdateData和UpdateUI并針對(duì)DataRow和object的重載。然后就大功告成。在需要數(shù)據(jù)交換的地方之需要簡(jiǎn)單調(diào)用UpdateData和UpdateUI即可。比如上面的那小段代碼就可以改為UIMapper1.UpdateData(ticketSaleBill)或這UIMapper1.UpdateUI(ticketSaleBill)。

IExtendProvider使用總結(jié):

<!--[if !supportLists]-->1、對(duì)于屬性的賦值。有時(shí)候我們可能需要要對(duì)UI控件更深一個(gè)層次的屬性賦值或取值,比如devExpress那些Edit常用的XXEdit1.Propertys.XXValue為了實(shí)現(xiàn)這個(gè)功能只好首先自己動(dòng)手,按“.”分割字符串,然后利用反射逐級(jí)獲取對(duì)象的實(shí)例。而且在嵌套發(fā)生時(shí),并不能確定是Property還是Field,為了應(yīng)對(duì)不同的情況BindingFlag最好設(shè)為BindingFlags.Static | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.GetField,然后利用InvokeMember來(lái)執(zhí)行操作。

<!--[if !supportLists]-->2、利用反射+Converter能實(shí)現(xiàn)大部分類型的轉(zhuǎn)換,但不能針對(duì)所有的類型。目前的做法是增加QueryObjectValue的事件,用于在賦值時(shí)由用戶處理特殊的類型轉(zhuǎn)換。

<!--[if !supportLists]-->3、在賦值發(fā)生異常時(shí)同樣通過(guò)事件通知用戶,由用戶決定處理的方式。在UpdateUI或UpdateData調(diào)用結(jié)束之后,返回Dictionary<object, Exception>即控件和異常的字典。

<!--[if !supportLists]-->4、用IExtenderProvider實(shí)質(zhì)上也是用Dictionary來(lái)實(shí)現(xiàn)擴(kuò)展,但其在設(shè)計(jì)時(shí)可以直觀進(jìn)行編輯,在運(yùn)行時(shí)也可以簡(jiǎn)單方便地進(jìn)行擴(kuò)展。

<!--[if !supportLists]-->5、 雖然反射的速度要比直接賦值慢,但是在這種情況下還是可取的。特別是當(dāng)實(shí)體的屬性較多或者數(shù)據(jù)庫(kù)表字段較多的情況下,可以在設(shè)計(jì)時(shí)直接設(shè)置,減少了代碼量。

【編輯推薦】

  1. Java連接MySQL中文亂碼處理
  2. 在Java應(yīng)用程序中使用Jfreechart配置
  3. Java虛擬機(jī)內(nèi)部構(gòu)成淺析
  4. 淺談Java線程的生命周期
  5. 關(guān)于Java繼承的一些復(fù)習(xí)
責(zé)任編輯:彭凡 來(lái)源: cnblogs
相關(guān)推薦

2010-01-06 14:36:04

JSON插件

2009-11-09 17:17:31

WCF元數(shù)據(jù)交換

2010-01-15 10:19:42

數(shù)據(jù)交換技術(shù)

2023-07-19 19:45:12

EDI人工智能

2018-08-31 21:00:39

數(shù)據(jù)交換模型數(shù)據(jù)模型應(yīng)用程序

2019-11-22 08:40:19

ProtobufGo編程語(yǔ)言

2010-03-02 10:50:57

WCF元數(shù)據(jù)交換

2009-01-03 14:54:40

ibmdwXML

2011-08-19 13:45:14

iPhone應(yīng)用iPhone OS數(shù)據(jù)

2012-09-26 09:51:11

電子政務(wù)數(shù)據(jù)交換

2010-02-04 11:15:12

數(shù)據(jù)交換技術(shù)

2012-01-04 00:10:52

ibmdw

2009-01-19 09:28:42

JSONJavaScriptJSON結(jié)構(gòu)

2009-11-06 10:25:34

WCF元數(shù)據(jù)交換

2009-11-06 10:45:47

WCF服務(wù)元數(shù)據(jù)交換

2010-02-04 11:20:29

網(wǎng)絡(luò)數(shù)據(jù)交換技術(shù)

2010-02-04 11:32:01

數(shù)據(jù)交換技術(shù)

2011-08-25 16:53:42

Lua數(shù)據(jù) 交換

2022-02-21 10:29:26

物聯(lián)網(wǎng)招聘IOT

2010-01-08 13:40:26

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品成人 | 久久精品国产亚洲夜色av网站 | av三级在线观看 | 成人高清网站 | 一区二区在线免费观看 | 久久爱一区 | 无码一区二区三区视频 | 亚洲三区在线观看 | 免费在线黄色av | 成人午夜精品 | 亚洲美女视频 | 国产精品毛片无码 | 亚洲国产免费 | 欧美日韩国产一区二区三区 | 免费h视频 | а_天堂中文最新版地址 | 欧美日韩国产精品一区 | 天天干免费视频 | 久久久久99| 成人在线视频网站 | 欧美一级做性受免费大片免费 | 精品二区 | 四虎影音 | 亚州午夜精品 | 日韩日b视频 | 成人在线免费观看 | www..com18午夜观看 | 欧美成人精品一区二区男人看 | 日韩激情一区 | 精品一区二区三区在线视频 | 亚洲欧美日韩高清 | 国产一区二区毛片 | 亚洲精品久久视频 | 香蕉视频久久久 | 色呦呦网站 | 欧美精品第三页 | 免费一区在线 | 亚洲性视频网站 | 欧美一区二区网站 | 99久久久国产精品免费消防器 | a级片播放 |