表单控件续(1)——应用接口来简化和分散代码

上次有点仓促,有几个地方没有明确。

1、两篇随笔可以合在一起看能自己“跑”的表单控件,思路,雏形,源码。vs2005版本 
我写项目的步骤。抛砖引玉。  

后者是整个流程,前者是其中的一个步骤,是一个简单的思路说明,其中前三段代码都是表单控件里面的。

2、我要写的是一个表单控件,b/s结构里面的控件。虽然内部会有点复杂,但是编译成dll后,调用就会很方便了。

上一篇里的表单控件有很多需要完善的地方,这里先说一下扩展性

      扩展呢就是说可以比较方便的添加更多的子控件,而现在的表单控件里面只有两种,文本框和下拉列表框,这个显然是不够用的,那么如何更好的扩展呢?

      先回顾一下表单控件里的代码,由于要控制不同的子控件,所以case里面写了很多的代码,那么能不能简化一下呢,或者分给子控件自己解决。

      先看一下取值的情况,一般文本框需要使用 .Text属性来取值,而下拉列表框需要使用 .SelectedValue 取值,其他的控件又有不同的属性,是不是很烦呢?那为什么不能统一一个方法呢?比如都叫 GetValue,那多方便呀。可惜,目前还没有。怎么办呢?自己动手、丰衣足食,我们自己来实现一个吧。

      那么具体怎么来实现呢?直接给基类加属性,好像是不太可能,只有利用接口了。集成.net框架里提供的框架,然后实现接口,表单控件里面在操作接口。(这个算不算面对接口编程呀?)

      先定义接口。

public interface IGetControlValue
    {
        /**//// 返回控件的编号
         string ControlKind{ get;}

        /**//// 默认的取值方式
         string GetControlValue();

        /**//// 可以选择的取值方式
         /// <param name="kind">取哪种值,比如提取下拉列表框的value还是text</param>
        string GetControlValue(string kind);

        /**//// 默认的给控件赋值的方式
         void SetControlValue(string value);

        /**//// 可以选择的赋值方式
         /// <param name="value">赋值</param>
        /// <param name="kind">通过哪种方式给控件赋值,比如通过下拉列表框的value还是text</param>
        void SetControlValue(string value, string kind);

        /**//// 通过控件的描述信息,进行自我描述。比如设置maxlength 等。
         void ShowMe(ControlInfos info);

    }

      这里不仅定义了取值和赋值用的几个函数,还设计了一个自我描述的函数,ShowMe(ControlInfos info);可以通过把一些任务交给子控件来实现

      然后写几个自定义控件,文本框

  实现接口#region 实现接口
        /**//// 获取文本框的.Text.Trim();
        public string GetControlValue()
        {
            return this.Text.Trim();
        }

        /**//// 给文本框的Text属性赋值
        /// <param name="value">赋值</param>
        public void SetControlValue(string value)
        {
            this.Text = value;
        }

        /**//// 设置 文本框的一些属性
        public void ShowMe(ControlInfos info)
        {
            //通过 info 里面的信息来设置 Columns、MaxLength 等属性。代码暂时略
        }

        #endregion

下拉列表框

 /**//// 获取下拉列表框选中的value值;
        public string GetControlValue()
        {
            return this.SelectedValue;
        }
        
        /**//// 通过kind获取下拉列表框的选中的值;
        /// <param name="kind">1:获取value;2:获取Text</param>
        public string GetControlValue(string kind)
        {
            switch (kind )
            {
                case "1":
                    return this.SelectedValue; 
                default :
                    return this.SelectedItem.Text; 
            }
         }
         
        /**//// 设置下拉列表框的默认选项
        public void SetControlValue(string value)
        {
            this.SetSelectedByValue(value);
        }

        /**//// 设置下拉列表框的默认选项
        /// <param name="kind">1:通过value;2:通过Text</param>
        public void SetControlValue(string value, string kind)
        {
           switch (kind)
            {
                case "1":
                    this.SetSelectedByValue(value); break;
                default:
                    SetSelectedByText(value); break;
            }
        }

        /**//// <summary>
        /// 设置 下拉列表框的一些属性
        /// </summary>
        /// <param name="info"></param>
        public void ShowMe(ControlInfos info)
        {
            //通过 info 里面的信息来 设置下拉列表框的item。代码暂时略
            //sql|select Col1 as id,col2 as txt from table |0|1
            //cus|0~1~男~女|0|1
       
            //先写一个测试用的
            this.Items.Add(new ListItem("测试项目1", "1"));
            this.Items.Add(new ListItem("测试项目2", "2"));
                        
        }

      然后在修改表单控件里面的 ShowData() 函数,当然还有 SaveDate() 函数。

public string ShowData()
        {
            IGetControlValue iCntl = null;
            Control  cntl = null;
            foreach (ControlInfos info in this.CtrlInfo)
            {
                switch (info.ControlKind)
                {
                    case "201":     //单行文本框
                        cntl = new JYKTextBox();  break;

                    case "205":     //下拉列表框
                        cntl = new JYKDropDownList(); break;

                }
               
                iCntl = (IGetControlValue)cntl;
                cntl.ID = "c_" + info.ColSysName;   //设置ID
                iCntl.ShowMe(info);                 //让子控件自己描绘自己

                //添加到表单控件里
                this.Controls.Add(new LiteralControl(info.ColName));
                this.Controls.Add(cntl);
                this.Controls.Add(new LiteralControl("<BR>"));

                iCntl.SetControlValue("sss");   //赋值测试

            }
            return "";
        }

         /**//// 保存数据
         public string SaveDate()
        {
             ControlInfos[] info = this.CtrlInfo;

            IGetControlValue iCntl = null;      //定一个接口
           
            string[] str1 = new string[info.Length];
            string[] str = new string[info.Length];

            for (int i = 0; i < info.Length; i++)
            {
                str1[i] = info[i].ColSysName;
                //这里可以去掉case 了。

                iCntl = this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;
                if (iCntl == null)
                    str[i] = "";
                else
                    str[i] = iCntl.GetControlValue();   //利用接口来取值

            }

           return "";
        }

 
ShowData() 函数里面的case 已经变得很短了,是不是有点像简单工厂?剩下的就都可以通过接口来操作了。
rex xiang 同学和怪怪同学等,说这里的case 可以使用  Dictionary  来去掉,但是目前对于 Dictionary 还是不太了解,所以先暂时使用case 的方式。   

SaveDate() 函数里面的case就完全去掉了,iCntl = this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;。很奇怪,C#里居然可以这么用,因为在编译的时候无法确定find出来的控件就一定实现了接口。这个居然也可以。

完整代码下载
http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html

时间: 2024-09-29 06:08:49

表单控件续(1)——应用接口来简化和分散代码的相关文章

表单控件的副产品——查询控件

查询控件 温故而知新能自己"跑"的表单控件,思路,雏形,源码.vs2005版本 表单控件续(1)--应用接口来简化和分散代码     当初在写表单控件的时候,突然想到,这个表单控件稍微修改一下不就是一个查询控件了吗?     那么查询控件需要做的什么事情呢?          1.自己描绘控件,比如能够自己添加文本框.下拉列表框这一类的控件.          2.可以自己获取用户输入的信息,根据查询方式组合where 后面的 SQL语句 .     是不是和表单控件很像呢?     

【思路】表单控件和查询控件,整理一下思路。

       这回不分页了,改成添加修改数据了.您是如何添加数据的呢?使用ORM.LinQ..net2.0新增加的FormView + SqlDataSource,还是其他?我还是喜欢自己动手丰衣足食.自己做一个表单控件来玩玩.        以前也写了几个关于表单控件的 post : 1.表单控件续(1)--应用接口来简化和分散代码 2.能自己"跑"的表单控件,思路,雏形,源码.vs2005版本          我简单的看了一下FormView + SqlDataSource的方式

能自己“跑”的表单控件,思路,雏形,源码。vs2005版本

下载地址: http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html 大家是怎么处理CRUD的呢? 这里说一下添加.修改数据.     一大堆的表,n多的字段,经常变化的表现形式(比如文本框换成下拉列表框等),是不是很头痛?反正我是很烦的,因为我太懒了,对于这种不是太重要的,但是有很繁琐的东东,我总是要向出来一种"简单"的方式来处理.     怎么办?表单控件,我还一直使用VS2003,没有VS2005里面的表单控件,所以只好

QuickPager asp.net 分页控件、表单控件等自定义控件下载 和介绍 【2009.09.07更新】

    最新下载地址: 自然框架的源代码.Demo.数据库.配置信息管理程序下载(2010.01.25更新)     QuickControl web控件集包含的控件 QuickControl web控件集--基本控件: 控件名称 说明 详细介绍 MyTextBox  继承TextBox,增加了几个属性,继承IControlMgr接口 进入 MyDropDownList  继承DropDownList,增加了几个属性,继承IControlMgr接口 进入 MyCheckBoxList  继承Ch

假乱真的表单控件:美化原生表单控件

文章描述:这样的模拟需要在兼顾实现设计的同时,还要保证网站的性能和可用性.这时我不禁开始怀念那些看起来平凡却非常实用的原生表单控件.如果用他们几乎可以解决以上所有问题. 在互联网成熟的今天,大家对网站的要求不仅仅在功能实现上,也开始注重视觉设计,多终端用户体验等等.表单控件是web页面上重要的组成元素,具有非常高的功能性.交互设计师为它设计更加方便的操作方式,视觉设计师也会绞尽脑汁设计出更加夺人眼球的视觉展现.可是由于表单控件自身的局限性,不能很好地自定义外表,所以就诞生了一系列的由聪明的前端同

ASP.NET中的XML表单控件

asp.net|xml|控件 导 读:介绍了有关ASP.NET中XML控件的使用,有个小BUG:在WEBFORM.ASPX中出现的XML控件,其中的transformsource属性设定了样式表文件路径,可是在文章出处没有找到这个XSL文件.:( 自己解决吧. --------------------------------------------------------------------------------在这个代码中揭示了微软在ASP.NET架构中隐藏的一个WEB表单控件,即<as

ASP入门教程-使用输入型表单控件

为了让用户通过表单输入数据,可以使用INPUT标记创建各种表单控件,通过将INPUT标记的TYPE属性设置为不同的值,可以创建不同类型的输入型表单控件. 1.单行文本框,格式如下: 一)格式: <form name="表单的名称" method="get | post" action="URL"> <input type="text" name="字符串" value="字符串&

ASP入门教程-使用其他表单控件

除了使用INPUT标记创建输入型表单控件外,也可以使用TEXTAREA标记创建多行文本框,或使用SELECT标记创建选项选单,还可以使用FIELDSET标记以表单中的控件进行分组. 1.在表单中使用多行文本框控件 一)格式: <form name="表单的名称" method="get | post" action="URL"> <TEXTAREA name="字符串" ROWS="整数"

excel2013如何插入表单控件

  excel2013插入表单控件的方法: 插入表单步骤1:先看下效果,下面是两个调查表单,左边使用的是单选按钮,右边使用的是复选按钮. 插入表单步骤2:插入表单控件是在开发工具选项卡下,该选项卡不在默认主选项卡,需要添加该选项卡.在 文件->选项->自定义功能区,勾选开发工具 插入表单步骤3:回到表格,即看到多了一个开发工具选项卡, 选择开发工具->插入->表单控件->分组框. 插入表单步骤4:将分组框重命名为"你的职业" 插入表单步骤5:再选择开发工具