上一篇說的是表單布局上的變化,也就是通過TR、TD的設定,實作了多行多列的效果。那麼格子畫好了,我們
可以往裡面放控件了。上次都是用的文本框,這個顯然是不行的,還要擴大這個範圍。
這個控件的範圍就比較大了,不光是TextBox、DropDownList,還有HTM編輯器這類的,都是可能會往裡面放的,當然象GridView這樣的就先不考慮了。另外還要可以擴充,可以随時增加新的子控件。
那麼控件得類型這麼多,要如何控制呢?第一用基類,第二用接口。
基類是.net FrameWork提供的,我們改不了,但是生成子控件的執行個體隻能靠基類了,Controls.Add隻能用Control,不能用接口吧。
接口的作用就是取值、指派,和屬性的設定。
取值指派好了解,每個控件的取值都不太一樣,TextBox用Text屬性,DropDownList是SelectedValue,這些是不一樣的,是以需要統一一下,要不然表單控件内部的代碼會越來越多,無法控制。
設定屬性,比如TextBox需要設定TextMode、Columns、MaxLength,以便于控制是單行文本、多行文本還是密碼,還有就是文本框的寬度、最大字元數等等;DropDownList要設定選項,一個空的下拉清單框是沒有用處的。另外還有前台的js驗證,這些都通過設定屬性的方式來實作。
接口的定義:

public interface IControlMgr
{
// 屬性
/**////
/// 統一的取值和指派的屬性
///
/// 控件的某個值
string ControlValue
{ get; set;}
// Properties
/// 傳回控件的類型 "201":文本框
string ControlKind
{ get; }
//函數
/// 根據kind擷取控件的某個屬性的值
/// 取值方式
string GetControlValue(string kind);
/// 根據kind設定控件的預設值
/// 指派方式
/// 值
void SetControlValue(string kind, string value);
/// 通過控件的描述資訊,進行自我描述。比如設定maxlength 等。
void ShowMe(JYK.Controls.Info.BaseColumnsInfo info,JYK.Data.DataAccessHelp dal);
}
繼承.net FrameWork的控件,然後實作這個接口,我們的子控件就誕生了。
在表單控件裡面控制子控件就很容易了,幾行代碼就可以搞定,子控件的變化都交給了ShowMe()來實作。

//定義接口,通過接口操作子控件

IControlMgr iControl = null;

Control tmpControl = null;


BaseColumnsInfo bInfo;


//循環配置資訊

foreach (KeyValuePair<int, BaseColumnsInfo> info in dic_BaseCols)
bInfo = (BaseColumnsInfo)info.Value;
加載需要的子控件,有待完善#region 加載需要的子控件,有待完善
switch (bInfo.ControlKind)
case "201": //單行文本框
case "202": //多行行文本框
case "203": //密碼文本框
tmpControl = new MyTextBox();
break;
case "205": //下拉清單框
tmpControl = new MyDropDownList();
case "208": // 多選()
tmpControl = new MyCheckBox();
case "210": // 多選組()
tmpControl = new MyCheckBoxList();
case "211": // HTML_FreeTextBox()
//tmpControl = new MyDropDownList();
}
#endregion
iControl = (IControlMgr)tmpControl; //定義接口,通過接口操作子控件
tmpControl.ID = "c_" + bInfo.ColumnID ; //設定ID
this.Controls.Add(tmpControl);
//Add 後才會調用Onit函數
iControl.ShowMe(bInfo, dal); //讓子控件自己描繪自己
}
表單控件的流程
添加資料:
1、得到頁面請求,到配置資訊裡面讀取需要的資訊,繪制UI,生成并加載需要的子控件。
2、客戶看到表單後填寫資訊,送出表單。送出之前可以進行js驗證。
3、又得到資訊了,這次是回傳的,我們需要擷取到使用者輸入的資訊,這個通過接口來得到。
4、得到資料之後,根據字段類型進行安全檢查。比如字段類型是int的,那麼就必須是整數,是DateTime的,就必須是合法的時間,并且在有效範圍内(1900-1-1 到9999-12-31)。在.net裡面1899-1-1是合法的日期,但是在SQL Server裡面卻超出了有效範圍。
5、然後我們可以根據配置資訊拼接參數化的SQL語句,添加存儲過程的參數。
6、借用“資料通路函數庫”,把SQL語句送出給資料庫執行。
7、檢測是否出現異常。
修改資料:
和上面的步驟差不多,增加一個給控件指派的步驟就可以了,指派也是通過接口來實作的,是以基本沒有幾行代碼。
攔截:
我們可以在第三步的前面和後面,加上“攔截”功能,進行“邏輯計算”,這樣一般的需求就都可以應付了。
現在表單控件已經可以增加子控件和實作添加資料的功能了,當然還需要完善,尤其是“屬性設定”這一塊,需要很好的規劃。
下圖是表單控件和查詢控件與各個子控件的關系圖,通過接口IControlMgr來實作對子控件的取值、指派和屬性設定。
下圖是表單控件可以實作的效果