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

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

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

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 "":

                    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 "":

                    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", ""));

            this.Items.Add(new ListItem("测试项目2", ""));

                        

        }

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

public string ShowData()

        {

            IGetControlValue iCntl = null;

            Control  cntl = null;

            foreach (ControlInfos info in this.CtrlInfo)

            {

                switch (info.ControlKind)

                {

                    case "":     //单行文本框

                        cntl = new JYKTextBox();  break;



                    case "":     //下拉列表框

                        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 = ; 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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木子昭的博客

学习React中ref的两个demo

虚拟Dom虽然能够提升网页的性能, 但虚拟 DOM 是拿不到用户输入的。为了获取文本输入框的一些操作, 还是js原生的事件绑定机制最好用~

723
来自专栏王磊的博客

史上最易懂——ReactNative分组列表SectionList使用详情及示例详解

React Native系列 《逻辑性最强的React Native环境搭建与调试》 《ReactNative开发工具有这一篇足矣》 《解决React N...

87714
来自专栏软件开发

前端MVC Vue2学习总结(五)——表单输入绑定、组件

一、表单输入绑定 1.1、基础用法 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,...

47714
来自专栏阮一峰的网络日志

如何做到 jQuery-free?

jQuery是现在最流行的JavaScript工具库。 据统计,目前全世界57.3%的网站使用它。也就是说,10个网站里面,有6个使用jQuery。如果只考察使...

3164
来自专栏转载gongluck的CSDN博客

C++中MFC Tab Control控件的使用详解

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Contr...

4466
来自专栏云瓣

从 0 到 1 实现 React 系列 —— JSX 和 Virtual DOM

看源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 React 框架的主干内容(JSX/虚拟DOM/...)

1041
来自专栏hightopo

基于 HTML5 的电力接线图 SCADA 应用

1403
来自专栏软件开发

前端MVC Vue2学习总结(五)——表单输入绑定、组件

你可以用 v-model 指令在表单控件元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法...

902
来自专栏HT

扩展HT for Web之HTML5表格组件的Renderer和Editor

在HT for Web提供了一下几种常用的Editor,分别是: slider:拉条 color picker:颜色选择器 enum:枚举类型 boolean:...

3497
来自专栏大数据钻研

HTML5学习笔记(一)

1.什么是 HTML5? HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。 HTML 的上一个版本诞生于 1999 年。自从那以后,...

3865

扫码关注云+社区

领取腾讯云代金券