使用接口来统一控件的取值、赋值和初始化
是呀,只不过我比较懒,尤其在写表单控件的时候,如何取值就是一个大问题了。以前用很笨的方法,用case一个一个的判断,代码写起来很长也不便于扩展。后来学习了接口,发现可以定一个接口来“统一”这些控件的取值问题,而且还可以扩展。
【接口定义】
{
// 属性
/// <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>
/// <param name="info">字段信息</param>
/// <param name="dal">数据访问函数库</param>
/// <param name="isForm">True:表单控件;False:查询控件</param>
void ShowMe(Nature.WebControls.BaseInfo.ColumnsInfoForm info, Nature.Data.DataAccessLibrary dal,bool isForm);
}
【CheckBoxList的实现代码】(其他的控件就省略了。)
 public class MyCheckBoxList:CheckBoxList , IControlHelp
    {
  #region 实现接口
        #region ControlValue
        /// <summary>
        /// 实现接口,SelectedValue
        /// </summary>
        [Bindable(true)]
        [Category("文本值")]
        [Description("通过SelectedValue设置选项;返回 SelectedValue 属性 ")]
        public string ControlValue
        {
            get { return GetSelectedItemValue(); }
            set { SetSelectedByValue(value); }
        }
        #endregion
        #region GetControlValue
        /// <summary>
        /// 返回 
        /// </summary>
        /// <param name="kind">取值的方式</param>
        /// <returns></returns>
        public string GetControlValue(string kind)
        {
            switch (kind)
            {
                default:       //返回SelectedValue
                    return GetSelectedItemValue();
                case "2":       //返回SelectedItemText
                    return GetSelectedItemText();
            }
        }
        #endregion
        #region SetControlValue
        /// <summary>
        /// 
        /// </summary>
        /// <param name="value"></param>
        /// <param name="kind"></param>
        public void SetControlValue(string value, string kind)
        {
            switch (kind)
            {
                default:       //
                    SetSelectedByValue(value);
                    break;
                case "2":       //
                    SetSelectedByText(value);
                    break;
            }
        }
        #endregion
        #region ControlKind
        /// <summary>
        /// 实现接口
        /// </summary>
        [Category("默认值"), Bindable(true), Description("获取控件类别")]
        public string ControlKind
        {
            get { return "210"; }
        }
        #endregion
        /// <summary>
        /// 自我描述
        /// </summary>
        /// <param name="ColInfo">配置信息</param>
        /// <param name="dal">数据访问函数库的实例</param>
        /// <param name="isForm">True:表单控件;False:查询控件</param>
        public virtual void ShowMe(BaseInfo.ColumnsInfoForm ColInfo, Nature.Data.DataAccessLibrary dal, bool isForm)
        {
            //base.Page.Response.Write(info + "<BR>");
            //System.Web.HttpContext.Current.Response.Write(info.ControlInfo  + "<BR>");
            string[] infos = ColInfo.ControlInfo.Split('|');
            if (infos.Length >= 3)
            {
                switch (infos[1])
                {
                    case "cus":     //自定义的形式
                        this.ItemAddByString(infos[2]);
                        break;
                    case "sql":     //自定义的形式
                        this.BindListBySQL(infos[2], dal);
                        break;
                    case "lst":     //列表自带的
                        break;
                }
            }
            this.RepeatColumns = 3;
            this.RepeatDirection = RepeatDirection.Horizontal;
        }
        #endregion
}
【使用代码】
foreach (WebControl ctrl in this.pnlAddUser.Controls)
{
ctrlHelp = (IControlHelp)ctrl;
Response.Write(ctrlHelp.ControlValue);
}
比如我们把控件都放在了一个Panel里面,那么我们就可以用遍历一下,把控件的值都取出来了。
这个对于表单控件还是很重要的,当然了也许对于您来说一点用处都没有。我这里也只是把我的想法写一下,也许能给一些人提醒一下呢。我觉得写程序,思路更重要。
其实常用的控件并不多,也就这么几个,如果不够的话,还可以随时扩展。 接口里的ShowMe是给分页控件用的,BaseInfo.ColumnsInfoForm 也是表单控件里的一个重要元素,是用来存放字段信息的。
 
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号