中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > 數(shù)據(jù)對(duì)象類表單自動(dòng)綁定
GSSY流程圖 回到列表 珊瑚蟲IP庫淺析
 數(shù)據(jù)對(duì)象類表單自動(dòng)綁定

作者:martin0728 時(shí)間: 2006-12-27 文檔類型:翻譯 來自:藍(lán)色理想

DarkangleFormBinder

本文附帶的代碼在Asp.Net 2.0下面調(diào)試通過

先講一下背景

在.Net多層結(jié)構(gòu)程序中,我們會(huì)使用一些O/R MAPPING的工具將數(shù)據(jù)庫表或視圖映射成實(shí)體數(shù)據(jù)模形用于封裝數(shù)據(jù),開發(fā)中我們可能經(jīng)常會(huì)寫這樣的代碼,例如,我們有一個(gè)Student的表,包含一些字段,如Name, Sex, Age, Grade, Height, Weight, ChooseClass.....

我們假設(shè)有一個(gè)錄入學(xué)生信息的表單,我們可能會(huì)寫這樣的一些代碼,在前臺(tái)上:

姓名:<asp:TextBox ID="Name" runat="Server" />
年齡:<asp:TextBox ID="Age" runat = "Server" />
年級(jí):<aspropDownList ID="Grade" runat = "server" />
課外活動(dòng): <asp:CheckBoxList ID="ChooseClass" runat= "server" />

后臺(tái)呢:

我們需要先構(gòu)造一個(gè)新的對(duì)象:

Student s= new Student();

然后設(shè)置它的屬性:

s.Name = Name.Text;
s.Age = Age.Text;
s.Grade = Grade.SelectedValue;

然后保存到后臺(tái)數(shù)據(jù)庫

如果是讀取一條記錄出來顯示在頁面上,我們可能先要取得一個(gè)對(duì)象實(shí)例:

Student s = bll.GetStudentById(id);
Name.Text = s.Name;
Age.Text = s.Age;
Grade.Items.FindByValue(s.Grade).Selected = true;

上面標(biāo)紅的部分代碼可能會(huì)非常多,尤其是在字段比較多的時(shí)候,設(shè)定這些值就非常麻煩,不但不能漏掉,還要做類型轉(zhuǎn)換等,稍有不小心就會(huì)出錯(cuò).

現(xiàn)在我們可以利用反射的方法將這些屬性自動(dòng)與控件值關(guān)聯(lián)起來,這樣就不用手動(dòng)地編寫這些代碼了.

具體內(nèi)容請看我的示例工程文件.注意要在Web.Config中加上控件的引用路徑.

這些代碼參考了MSDN上面的內(nèi)容,但是原來的代碼有BUG,并且不支持可以多項(xiàng)選擇的控件.我在這里加入了兩個(gè)控件,分別是DarkangleCheckBoxList和DarkangleListBox 這兩個(gè)控件支持將多項(xiàng)選擇的屬性以逗號(hào)分開的方式存儲(chǔ)于數(shù)據(jù)庫字段中.  比如,學(xué)生.課余活動(dòng) = "照象,游泳,足球",不需要寫額外的代碼即可直接綁定到多項(xiàng)選擇控件.

目前支持的綁定控件有:Label,TextBox,CheckBox,DarkangleCheckBoxList,DarkangleListBox(如果您只需要單項(xiàng)選擇,則可以使用自帶的ListBox控件),ListBox,DropDownList, RadioButton,RadioButtonList,日歷控件.

希望我寫的東西對(duì)您的開發(fā)有所幫助.

Good luck~~~~;)

源代碼與示例打包下載

應(yīng)版主大人要求,把源碼貼出來的,其實(shí)我提供的下載包里面是有源碼的,就在類工程里面,隨便也把原來那個(gè)老外的也帖上來,我修改了部分內(nèi)容,原來那個(gè)代碼運(yùn)行起來也是有問題的。

先帖我的:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Reflection;

namespace Darkangle
{
    public class FormBinder
    {
        public static void BindObjectToControls(object obj, Control container)
        {
            if (obj == null) return;
            Type objType = obj.GetType();
            PropertyInfo[] objPropertiesArray = objType.GetProperties();
            foreach (PropertyInfo objProperty in objPropertiesArray)
            {
                Control control = container.FindControl(objProperty.Name);
                bool success = false;
                bool isCustom = false;
                if (control is DarkangleListBox)
                {
                    DarkangleListBox listBox = (DarkangleListBox)control;
                    string propertyValue = objProperty.GetValue(obj, null).ToString();
                    listBox.SetListValue(propertyValue);
                    isCustom = true;
                }
                if (control is DarkangleCheckBoxList)
                {
                    DarkangleCheckBoxList checkBoxList = (DarkangleCheckBoxList)control;
                    string propertyValue = objProperty.GetValue(obj, null).ToString();
                    checkBoxList.SetListValue(propertyValue);
                    isCustom = true;
                }
                if (!isCustom)
                {
                    if (control is ListControl)
                    {
                        ListControl listControl = (ListControl)control;
                        string propertyValue = objProperty.GetValue(obj, null).ToString();
                        ListItem listItem = listControl.Items.FindByValue(propertyValue);
                        if (listItem != null) listItem.Selected = true;
                    }
                    else
                    {
                        Type controlType = control.GetType();
                        PropertyInfo[] controlPropertiesArray = controlType.GetProperties();
                        success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Checked", typeof(bool));
                        if (!success)
                        {
                            success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "SelectedDate", typeof(DateTime));
                            if (success)
                                FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "VisibleDate", typeof(DateTime));
                        }
                        if (!success)
                            success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Value", typeof(String));
                        if (!success)
                            success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Text", typeof(String));
                    }
                }
            }
        }
        private static bool FindAndSetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type)
        {
            foreach (PropertyInfo controlProperty in controlPropertiesArray)
            {
                if (controlProperty.Name == propertyName && controlProperty.PropertyType == type)
                {
                    controlProperty.SetValue(control, Convert.ChangeType(objProperty.GetValue(obj, null), type), null);
                    return true;
                }
            }
            return false;
        }
        public static void BindControlsToObject(object obj, Control container)
        {
            if (obj == null) return;
            Type objType = obj.GetType();
            PropertyInfo[] objPropertiesArray = objType.GetProperties();
            foreach (PropertyInfo objProperty in objPropertiesArray)
            {
                bool success = false;
                bool isCustom = false;
                Control control = container.FindControl(objProperty.Name);
                if (control is DarkangleListBox)
                {
                    DarkangleListBox listBox = (DarkangleListBox)control;
                    if (listBox.SelectedIndex > -1)
                        objProperty.SetValue(obj, Convert.ChangeType(listBox.GetListValue(), objProperty.PropertyType), null);
                    isCustom = true;
                }
                if (control is DarkangleCheckBoxList)
                {
                    DarkangleCheckBoxList checkBoxList = (DarkangleCheckBoxList)control;
                    if (checkBoxList.SelectedIndex > -1)
                        objProperty.SetValue(obj, Convert.ChangeType(checkBoxList.GetListValue(), objProperty.PropertyType), null);
                    isCustom = true;
                }
                if (!isCustom)
                {
                    if (control is ListControl)
                    {
                        ListControl listControl = (ListControl)control;
                        if (listControl.SelectedItem != null)
                            objProperty.SetValue(obj, Convert.ChangeType(listControl.SelectedItem.Value, objProperty.PropertyType), null);
                    }
                    else
                    {
                        Type controlType = control.GetType();
                        PropertyInfo[] controlPropertiesArray = controlType.GetProperties();

                        success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Checked", typeof(bool));
                        if (!success)
                            success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "SelectedDate", typeof(DateTime));
                        if (!success)
                            success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Value", typeof(String));
                        if (!success)
                            success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Text", typeof(String));
                    }
                }
            }
        }
        private static bool FindAndGetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type)
        {
            foreach (PropertyInfo controlProperty in controlPropertiesArray)
            {
                if (controlProperty.Name == propertyName && controlProperty.PropertyType == type)
                {
                    try
                    {
                        objProperty.SetValue(obj, Convert.ChangeType(controlProperty.GetValue(control, null), objProperty.PropertyType), null);
                        return true;
                    }
                    catch
                    {
                        return false;
                    }
                }
            }
            return false;
        }
    }
}

這兩個(gè)是我護(hù)展出來的控件:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;

namespace System.Web.UI.WebControls
{
   
    public class DarkangleCheckBoxList : CheckBoxList
    {
        public void SetListValue(string listValue)
        {
            if (listValue == null || listValue.Trim() == string.Empty)
                return;
            string[] valueList = listValue.Split(new char[] { ',' });
            if (valueList.Length == 0)
                return;
            for (int i = 0; i < valueList.Length; i++)
            {
                if (valueList[i].Length != 0 && valueList[i] != string.Empty)
                    this.Items.FindByValue(valueList[i]).Selected = true;
            }
        }
        public string GetListValue()
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < this.Items.Count; i++)
            {
                if (this.Items[i].Selected)
                    sb.Append(this.Items[i].Value + ",");
            }
            return sb.Remove(sb.Length - 1, 1).ToString();
        }
    }
    public class DarkangleListBox : ListBox
    {
        public void SetListValue(string listValue)
        {
            if (listValue == null || listValue.Trim() == string.Empty)
                return;
            string[] valueList = listValue.Split(new char[] { ',' });
            if (valueList.Length == 0)
                return;
            for (int i = 0; i < valueList.Length; i++)
            {
                if (valueList[i].Length != 0 && valueList[i] != string.Empty)
                    this.Items.FindByValue(valueList[i]).Selected = true;
            }
        }
        public string GetListValue()
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < this.Items.Count; i++)
            {
                if (this.Items[i].Selected)
                    sb.Append(this.Items[i].Value + ",");
            }
            return sb.Remove(sb.Length-1,1).ToString();
        }
    }
}

經(jīng)典論壇討論
http://bbs.blueidea.com/thread-2707666-1-1.html

出處:藍(lán)色理想
責(zé)任編輯:blue

◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
數(shù)據(jù)引起的思考
簡潔的表單驗(yàn)證程序
常見可用性錯(cuò)誤——表單組件錯(cuò)誤
用css制作表單并體驗(yàn)親和力
SPL3.0數(shù)據(jù)連接詳解
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計(jì)比賽 網(wǎng)頁制作 web標(biāo)準(zhǔn) 用戶體驗(yàn) UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點(diǎn)最新 站點(diǎn)最新列表
周大!熬•自然”設(shè)計(jì)大賽開啟
國際體驗(yàn)設(shè)計(jì)大會(huì)7月將在京舉行
中國國防科技信息中心標(biāo)志征集
云計(jì)算如何讓安全問題可控
云計(jì)算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會(huì)
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅(jiān)的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計(jì)大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺(tái)歷
Ps簡單繪制一個(gè)可愛的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡單的作品展示頁面
CSS定位機(jī)制之一:普通流
25個(gè)最佳最閃亮的Eclipse開發(fā)項(xiàng)目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨(dú)家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點(diǎn)的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請不要盜鏈到本站,且不準(zhǔn)打上各自站點(diǎn)的水印,亦不能抹去我站點(diǎn)水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計(jì)作品,如需使用,請與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請與我們聯(lián)系,我們將立即刪除修改。

您的評(píng)論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評(píng)論。如果您不是本站會(huì)員,你可以注冊 為本站會(huì)員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯(cuò)誤,請用報(bào)告錯(cuò)誤,以利文檔及時(shí)修改。
不評(píng)分 1 2 3 4 5
注意:請不要在評(píng)論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請您注意:
·不良評(píng)論請用報(bào)告管理員,以利管理員及時(shí)刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國的各項(xiàng)有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評(píng)論管理人員有權(quán)保留或刪除其管轄評(píng)論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評(píng)論文檔 | 報(bào)告錯(cuò)誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計(jì)之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計(jì)》
犀利開發(fā)—jQuery內(nèi)核詳解與實(shí)踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2