天天看點

【實作】表單控件裡的子控件的變化。

     上一篇說的是表單布局上的變化,也就是通過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來實作對子控件的取值、指派和屬性設定。

【實作】表單控件裡的子控件的變化。

下圖是表單控件可以實作的效果

【實作】表單控件裡的子控件的變化。