使用接口来统一控件的取值、赋值和初始化

      这里说的控件主要指的是文本框、下拉列表框这一类的控件,用户使用这些控件输入数据,然后我们需要提取这些数据进行处理。但是不同的控件有不同的取值方式,比如文本框要用Text,下拉列表框是SelectedValue (当然还有其他的方法),CheckBoxList也是SelectedValue,但是这个只能获取第一个选项,如果是选择了多个选项,他只能返回第一个被选中的选项。可能您觉得这个没什么的呀,很正常呀。

      是呀,只不过我比较懒,尤其在写表单控件的时候,如何取值就是一个大问题了。以前用很笨的方法,用case一个一个的判断,代码写起来很长也不便于扩展。后来学习了接口,发现可以定一个接口来“统一”这些控件的取值问题,而且还可以扩展。

      【接口定义】

public interface IControlHelp
    {
 // 属性
 /// <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

}

      【使用代码】

            IControlHelp ctrlHelp;
 foreach (WebControl ctrl in this.pnlAddUser.Controls)
            {
                ctrlHelp = (IControlHelp)ctrl;
                Response.Write(ctrlHelp.ControlValue);
            }

      比如我们把控件都放在了一个Panel里面,那么我们就可以用遍历一下,把控件的值都取出来了。

      这个对于表单控件还是很重要的,当然了也许对于您来说一点用处都没有。我这里也只是把我的想法写一下,也许能给一些人提醒一下呢。我觉得写程序,思路更重要。

      其实常用的控件并不多,也就这么几个,如果不够的话,还可以随时扩展。 接口里的ShowMe是给分页控件用的,BaseInfo.ColumnsInfoForm 也是表单控件里的一个重要元素,是用来存放字段信息的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

CListBox

CListBox 一:词条简介 CObject←CCmdTarget←CWnd←CListBox CListBox类提供Windows列表框的功能。列表框显...

19180
来自专栏javascript趣味编程

2.2.3 文档对象模型DOM及表单

文档对象模型DOM用途是什么?先从一棵树说起。下面是一棵树,由,根部、枝干、叶构成,通过根部可以访问到任何一个叶节点。

21500
来自专栏Modeng的专栏

Vue2.5笔记:Vue中的模版

我们在上一篇说到如何把 Vue 实例中的数据显示到视图中,就会需要用到我们的模版,我们只是简单的使用了一些,模版其实还有很多其他的特性。今天我们就来看看模版的其...

13110
来自专栏马涛涛的专栏

虚拟DOM

DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个 JavaScr...

39220
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第四天 jQuery学习

jQuery是一个JavaScript框架。它兼容CSS3,还兼容各种浏览器。文档说明很全,应用详细,成熟插件多。

16840
来自专栏GreenLeaves

Vue.js系列之三模板语法

Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML ,...

246100
来自专栏web前端

JavaScript基础学习--01热身

一、js大致思路: 1、完成静态HTML+CSS 2、过一遍整体的大致js思路 3、按照从上到下的,从有至无的顺序完成js编写(包括先写大致轮廓,再细化细节部分...

19390
来自专栏卡少编程之旅

四个Vue的写法优化技巧

36760
来自专栏web前端

Vuejs --02 Vue实例

一、构造器      1、vm(view model 表示Vue实例),每个Vuejs都是通过构造函数Vue创建Vue的根实例启动 var vm = new V...

23280
来自专栏JetpropelledSnake

Vue学习笔记之Vue指令系统介绍

所谓指令系统,大家可以联想咱们的cmd命令行工具,只要我输入一条正确的指令,系统就开始干活了。

10740

扫码关注云+社区

领取腾讯云代金券