為了保持整個系統有足夠的擴展和足夠的彈性(能夠滿足災WebForm和WinForm中的使用
以及其他數據庫更新的來源
比如說Office
中InfoPath
以及WebService等等)
我將整個DBForm的構架拆分為FormInfo類和SqlBuilder兩個基類
下面分別描述FormInfo類和SqlBuilder類的作用以及申明
FormInfo主要負責整個數據庫Field信息的抓取
主要包括了以下兩個方法
/// 添加將要進行遍歷的容器
public virtual void AppendContainer(object AContainer)
/// 添加單個控件
public virtual void AppendControl(object AControl)
/// 清除先前已經配置好的Form信息
public void ClearFormInfo()
主要提供了兩個虛方法
一個公開的ClearFormInfo方法
從方法名稱上面的含義大家看得很清楚了
整個FormInfo可以根據容器和單獨的控件進行添加
在這裡
我有必要說明一下我的DBForm架構中針對Winform和WebForm的擴展
因為下面的WinFormInfo類和WebFormInfo類分別繼承自FormInfo
實現WinForm和WebForm的信息提取
再WinFormInfo和WebFormInfo中
主要是一個針對Container的循環
以及通過重寫AppendContainer實現
/// 添加將要進行遍歷的容器
public override void AppendContainer(object AContainer)
{
System
Web
UI
Control Container = (System
Web
UI
Control)AContainer;
foreach(Control AControl in Container
Controls)
{
this
DoAppendControl(AControl);
}
}
在下面的WebQueryForm和WebModifyForm中
就是實現具體的Form信息提取了
為什麼要用這麼多類的繼承呢?我覺得這樣的視線
主要有以下幾點好處
.FormInfo類主要提供最公開的接口
以及一些基礎的方法(提供了一個protected的方法
用於將分析出的Form信息填充入FormInfoEntity中(窗體信息的描述類)
.WinFormInfo和WebFormInfo類主要是把容器Object轉換成為具體的WinContrl和WebControl
並且調用相應的控件信息解析器
實現數據的提取
.接下來的ModifyFormInfo和QueryFormInfo主要就提供了控件的信息解析器具體實現
根據具體的控件和具體的任務(Modify呢還是Query)分別解析出控件的信息
比如說QueryFormInfo中需要加入相關操作符號的信息(LIKE
=等等)
下面是具體控件的添加操作
private void DoAppendControl(System
Web
UI
Control AControl)
{
if (AControl is SmisNet
WebControl
SmisDropDown)
{
this
DoAppendDropDownList(AControl as SmisNet
WebControl
SmisDropDown);
}
else if (AControl is System
Web
UI
WebControls
TextBox)
{
this
DoAppendTextBox(AControl as SmisNet
WebControl
SmisTextBox);
}
else if (AControl is System
Web
UI
WebControls
ListBox)
{
this
DoAppendListBox((System
Web
UI
WebControls
ListBox)AControl);
}
}
其實這部分代碼寫得並不算優美
包括DoAppendDropDownList等方法都寫成了虛方法
有不少代碼的臭味到
其實不應該這樣的
只是因為我們現在的工作比較簡單(只有這三種窗體
不過我想包括了大多數信息系統開發的情況)如果您使用了其他的控件
可以考慮修改AControl is xxx
然後天加上自己的控件的處理方法
FormInfo就支持了新的控件的解析
這一系列的類的具體操作
就實現了窗體數據的信息提取
接下來我們應該考慮怎麼把提取出來的數據
轉換成為Sql
From:http://tw.wingwit.com/Article/os/xtgl/201311/5224.html