先看Demo智能数据收集控件使用说明:有下面7种控件:
-----------------------
1,日历控件      Calendar
2,复选框控件    BrainCheckBox
3,下拉列表控件  BrainDropDownList
4,标签控件      BrainLabel
5,列表控件      BrainListBox
6,选项按钮控件  BrainRadioButton
7,文本框控件    BrainTextBox上面7种控件除了日历控件之外,均继承与.NET系统的Web服务器控件,具有原控件的一切功能。
所有的智能数据收集控件继承下面的接口:
 interface IBrainControl
    {
        /// <summary>
        /// 与数据库数据项相关联的数据
        /// </summary>
        string MapToProperty
        {
            get;
            set;
        }        /// <summary>
        /// 与数据关联的表名
        /// </summary>
        string MapToObject
        {
            get;
            set;
        }
        /// <summary>
        /// 数据类型
        /// </summary>
        TypeCode SysTypeCode
        {
            get;
            set;
        }        /// <summary>
        /// 只读标记
        /// </summary>
        bool ReadOnly
        {
            get;
            set;
        }
        /// <summary>
        /// 是否允许空值
        /// </summary>
        bool isNull
        {
            get;
        }        /// <summary>
        /// 查询的比较符号,例如 =,>=,
        /// </summary>
        string CompareSymbol
        {
            get;
            set;
        }
        /// <summary>
        /// 设置值
        /// </summary>
        /// <param name="obj"></param>
        void SetValue(object value);        /// <summary>
        /// 获取值
        /// </summary>
        /// <returns></returns>
        object GetValue();
    }
    
    
注:Calendar 和 CBrainTextBox 控件还有特别的属性 QueryFormatString,表示用于数据库查询的时候格式化字符串。
例如,对日期型字段的查询,Oracle可能会使用 to_date 函数,为此我们可以设定:
QueryFormatString="to_date('{0}','yyyy-MM-dd')"--------------------------------------------------------------------------------
类 CollectWebData 提供了下面几个静态的方法: /// <summary>
        /// 填充数据到实体类中
        /// </summary>
        /// <param name="objData">实体类</param>
        /// <param name="controlList">控件容器</param>
public static void FillData(Object objData,Control controlList){...}

/// <summary>
        /// 收集数据到实体类中
        /// </summary>
        /// <param name="objData">实体类对象</param>
        /// <param name="conlObject">控件容器</param>
        /// <returns>返回收集了数据的实体类对象</returns>
public static object CollectData(object objData,Control conlObject){...}

/// <summary>
        /// 让容器中所有的BrainControl值设置为空
        /// </summary>
        /// <param name="conlObject">容器对象</param>
        public static void ClearData(Control conlObject){...}
        
        /// <summary>
        /// 收集控件的查询字符串,例如已经为控件指定了查询条件比较符号。
        /// </summary>
        /// <param name="conlObject">容器对象</param>
        /// <returns>查询字符串</returns>
        public static string CollectQueryString(Control conlObject){...}
        
 注:上面说的实体类可以是任何类,只要它的 属性名称和数据收集控件指定的MapToProperty一致,
 类名称和和数据收集控件指定的MapToObject一致即可。
 
 “容器对象”是指存放数据收集控件的容器对象,比如 Page,Panel,Table等。

解决方案 »

  1.   

    测试例子中,有一个简单的类:
     public class UserInfo
        {
            int _ID;        public int ID
            {
                get { return _ID; }
                set { _ID = value; }
            }
            string _UserName;        public string UserName
            {
                get { return _UserName; }
                set { _UserName = value; }
            }
            bool _Sex;        public bool Sex
            {
                get { return _Sex; }
                set { _Sex = value; }
            }
            string _IDCode;        public string IDCode
            {
                get { return _IDCode; }
                set { _IDCode = value; }
            }
            string _Nation;        public string Nation
            {
                get { return _Nation; }
                set { _Nation = value; }
            }
            float  _stature;        public float Stature
            {
                get { return _stature; }
                set { _stature = value; }
            }
            string _Re;        public string Re
            {
                get { return _Re; }
                set { _Re = value; }
            }        DateTime _Birthday;        public DateTime Birthday
            {
                get { return _Birthday; }
                set { _Birthday = value; }
            }    }
    在Web页中,使用下面的代码实现了数据的收集和填充等。。
     protected void btnNew_Click(object sender, EventArgs e)
            {
                if (this.txtUserName.Text.Trim() != "")
                {
                    UserInfo ui = new UserInfo() { ID = ++s_id };
                    this.blID.Text = ui.ID.ToString();
                    CollectWebData.CollectData(ui, this);
                    list.Add(ui);
                    this.dddlUid.Items.Add(ui.ID.ToString());
                    this.lblMsg.Text = "No." + s_id.ToString() + "个用户信息收集成功";
                    
                }
                else
                {
                    this.lblMsg.Text = "用户名不能为空";
                }
                
            }        protected void btnSave_Click(object sender, EventArgs e)
            {
                string sUid = this.dddlUid.SelectedValue;
                if (sUid != "")
                {
                    //UserInfo ui = list[s_id];
                    UserInfo ui = list[int.Parse(sUid)-1];
                    CollectWebData.FillData(ui, this);
                    this.lblMsg.Text = "用户信息填充成功!";
                }
                
            }        protected void btnDelete_Click(object sender, EventArgs e)
            {
                CollectWebData.ClearData(this);
            }        protected void btnQuery_Click(object sender, EventArgs e)
            {
                this.lblMsg.Text = CollectWebData.CollectQueryString(this); 
            }
      

  2.   

    现在重新采用了Lambda表达式来查询,呵呵,功能一样,不过这样我可以节省内存了。
     protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    this.lblMemo.Text = @"注:Calendar 和 CBrainTextBox 控件还有特别的属性 QueryFormatString,表示用于数据库查询的时候格式化字符串。
    例如,对日期型字段的查询,Oracle可能会使用 to_date 函数,为此我们可以设定:
    QueryFormatString=“to_date('{0}','yyyy-MM-dd')”";
                    if (list.Count > MAX_LENGTH)
                        list.Clear();
                    if (s_id > MAX_LENGTH)
                        for (int i = s_id - MAX_LENGTH; i < s_id; i++)
                            this.dddlUid.Items.Add(i.ToString());
                }
                
            }
     protected void btnSave_Click(object sender, EventArgs e)
            {
                string sUid = this.dddlUid.SelectedValue;
                if (sUid != "")
                {
                    //UserInfo ui =list [int.Parse(sUid)-1];
                    var obj = from item in list
                                  where item.ID == int.Parse(sUid)
                                  select item;
                    if (obj.Count() > 0)
                    {
                        UserInfo ui = obj.First();
                        CollectWebData.FillData(ui, this);
                        this.lblMsg.Text = "用户信息填充成功!";
                    }
                    else
                        this.lblMsg.Text = "对不起,为节约内存,集合不能大于" + MAX_LENGTH + "个成员,已经被情空,请重新进入本页!";
                    
                }
                
            }
      

  3.   

    Kao,空间居然不支持linQ,又改了回去.欢迎大家测试!
      

  4.   

    谢谢楼上,我做的就是一个框架,快速Web开发的框架,可以自动填充数据和收集数据到数据源,数据源可以是实体 Class,也可以是数据库.
    下面继续贴代码:
    今天采用控件集合,重写了框架,下面是改进的代码:
    protected void btnSave_Click(object sender, EventArgs e)
            {
                string sUid = this.dddlUid.SelectedValue;
                if (sUid != "")
                {
                    //UserInfo ui = list[s_id];
                    UserInfo ui = list[int.Parse(sUid) - 1];
                    //如果是Pannel,那么可以直接使用Pannel.Controls,而不用
                    //WebControlDataMap.FindControls(this.Table1, new List<IDataControl>())                WebControlDataMap.FillDataFromEntityClass(ui, 
                        WebControlDataMap.FindControls(this.Table1, new List<IDataControl>()));
                    this.lblMsg.Text = "用户信息填充成功!";
                }
            }下面是方法的定义: /// <summary>
        /// Web 窗体控件数据映射类,提供从实体对象填充数据到窗体数据控件和收集数据到实体对象的功能。
        /// </summary>
       public  class WebControlDataMap:ControlDataMap 
        {
    ...
    /// <summary>
           /// 从实体类中填充数据
           /// </summary>
           /// <param name="objEntityClass">实体类</param>
           /// <param name="controls">控件集合</param>
           public static void FillDataFromEntityClass(object objEntityClass, ICollection controls)
           {
               if (objEntityClass == null)
                   throw new Exception("实体类不能为空!");
               if (controls==null || controls.Count == 0)
                   throw new Exception("控件集合不能为空!");
               new ControlDataMap().FillData(objEntityClass, controls, true);
           }
    ...
    }
      

  5.   

    我提个小建议,约定优于配置,实际上  MapToProperty MapToObject SysTypeCode这几个字段都没有必要你可以把控件的名字和字段的名字取得一样,比如drpNames,这个控件命名记得到了控件信息,也得到了字段信息。
      

  6.   


    这样虽然可以简化处理,但是从输出到客户端的控件ID就可以推测数据库的表名和字段名,这样做的Web系统还是很危险的,特别是不熟悉的Web设计者。