1. 程式人生 > 其它 >【實現】表單控制元件裡的子控制元件的變化。

【實現】表單控制元件裡的子控制元件的變化。

     上一篇說的是表單佈局上的變化,也就是通過TR、TD的設定,實現了多行多列的效果。那麼格子畫好了,我們

可以往裡面放控制元件了。上次都是用的文字框,這個顯然是不行的,還要擴大這個範圍。

     這個控制元件的範圍就比較大了,不光是TextBox、DropDownList,還有HTM編輯器這類的,都是可能會往裡面放的,當然象GridView這樣的就先不考慮了。另外還要可以擴充套件,可以隨時增加新的子控制元件。

     那麼控制元件得型別這麼多,要如何控制呢?第一用基類,第二用介面。

     基類是.net FrameWork提供的,我們改不了,但是生成子控制元件的例項只能靠基類了,Controls.Add只能用Control,不能用介面吧。

     介面的作用就是取值、賦值,和屬性的設定。

     取值賦值好理解,每個控制元件的取值都不太一樣,TextBox用Text屬性,DropDownList是SelectedValue,這些是不一樣的,所以需要統一一下,要不然表單控制元件內部的程式碼會越來越多,無法控制。

     設定屬性,比如TextBox需要設定TextMode、Columns、MaxLength,以便於控制是單行文字、多行文字還是密碼,還有就是文字框的寬度、最大字元數等等;DropDownList要設定選項,一個空的下拉列表框是沒有用處的。另外還有前臺的js驗證,這些都通過設定屬性的方式來實現。

     介面的定義:

public interface IControlMgr
    {
        // 屬性
        /**//// <summary>
        /// 統一的取值和賦值的屬性
        /// </summary>
        /// <returns>控制元件的某個值</returns>
        string ControlValue{ get; set;}

        // Properties
        /**//// <summary>
        /// 返回控制元件的型別 "201":文字框
        /// </summary>
        string ControlKind { get; }
        
        //函式
        /**//// <summary>
        /// 根據kind獲取控制元件的某個屬性的值
        /// </summary>
        /// <param name="kind">取值方式</param>
        /// <returns></returns>
        string GetControlValue(string kind);
        
        /**//// <summary>
        /// 根據kind設定控制元件的預設值
        /// </summary>
        /// <param name="kind">賦值方式</param>
        /// <param name="value">值</param>
        void SetControlValue(string kind, string value);

        /**//// <summary>
        /// 通過控制元件的描述資訊,進行自我描述。比如設定maxlength 等。
        /// </summary>
        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(); 
                        break;

                   
                    case "208":      // 多選()
                         tmpControl = new MyCheckBox(); 
                        break;
                     case "210":      // 多選組()
                         tmpControl = new MyCheckBoxList(); 
                        break;

                    case "211":  // HTML_FreeTextBox()
                        //tmpControl = new MyDropDownList(); 
                        break;
 
                }
                #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來實現對子控制元件的取值、賦值和屬性設定。

下圖是表單控制元件可以實現的效果