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

下载地址:

 http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html

大家是怎么处理CRUD的呢?

这里说一下添加、修改数据。

    一大堆的表,n多的字段,经常变化的表现形式(比如文本框换成下拉列表框等),是不是很头痛?反正我是很烦的,因为我太懒了,对于这种不是太重要的,但是有很繁琐的东东,我总是要向出来一种“简单”的方式来处理。

    怎么办?表单控件,我还一直使用VS2003,没有VS2005里面的表单控件,所以只好自己写了,另外好像VS2005里面的表单控件使用的也不是很多。

    我的表单控件要做的事情:

    1、自己描绘控件,比如能够自己添加文本框、下拉列表框这一类的控件。

    2、可以自己获取用户输入的信息,进行验证(前台的js验证和后台的数据的类型是否符合子段类型的验证),组合SQL语句或者调用存储过程来添加、修改数据。

    3、在修改数据的时候,可以从数据库里提取数据,填充到对应的控件里。

    这个好像和05的表单控件差不多,不过有两个明显的区别。

    1、05的需要另外设置文本框这样的控件。

    2、使用DataSource这一类的控件来保存关联信息,而这些信息都是通过属性的方式设置,而且默认情况下是放在了aspx文件里面了。

    对于第一点呢,操作繁琐,当然也是很灵活;第二点嘛,就不好了。一两个页面的话,还好办,如果有100个这样的页面的话,那管理就是一个问题了。

    那么怎么实现我想要的效果呢,我采用自定义控件的方式来实现。

    1、先定义一个结构(好像也可以使用类)。

    2、根据属性添加子控件,也就是具体的控件(比如文本框、下拉列表框等)。

    3、取值,保存数据。

    4、修改的时候显示数据。

    [具体实现]

    1、先定义一个结构(好像也可以使用类)。

[Serializable()] public struct ControlInfos
    {
        /// <summary>
        /// 字段名称
        /// </summary>
        public string ColSysName;   

        /// <summary>
        /// 中文名称
        /// </summary>
        public string ColName;
        
        /// <summary>
        /// 控件类别
        /// </summary>
        public string ControlKind;
        
        /// <summary>
        /// 描述信息
        /// </summary>
        public string ColInfo;

    }

    2、根据属性添加子控件,也就是具体的控件(比如文本框、下拉列表框等)。

protected override void CreateChildControls()
        {
            base.CreateChildControls();
            ShowData();
        }
 public string ShowData()
        {
            foreach (ControlInfos info in this.CtrlInfo)
            {
                switch (info.ControlKind)
                {
                    case "":     //单行文本框
                        TextBox txt = new TextBox();
                        txt.ID = "c_" + info.ColSysName ;
                        this.Controls.Add(new LiteralControl(info.ColName ));
                        this.Controls.Add(txt);
                        this.Controls.Add(new LiteralControl("<BR>"));
                        break;

                    case "":     //下拉列表框
                        DropDownList lst = new DropDownList();
                        lst.ID = "c_" + info.ColSysName;
                        //lst.Items.Clear();
                        lst.Items.Add(new ListItem("测试项目1", ""));
                        lst.Items.Add(new ListItem("测试项目2", ""));
                       
                        this.Controls.Add(new LiteralControl(info.ColName));
                        this.Controls.Add(lst);
                        this.Controls.Add(new LiteralControl("<BR>"));
                        break;

                }
            }

            return "";

        }

    3、取值,保存数据。

public string SaveDate()
        {
            //调用数据访问函数库来保存数据
            ControlInfos[] info = this.CtrlInfo;

            string[] str1 = new string[info.Length];
            string[] str = new string[info.Length];
            for (int i = ; i < info.Length; i++)
            {
                str1[i] = info[i].ColSysName;

                switch (info[i].ControlKind)
                {
                    case "":
                        TextBox txt = new TextBox();
                        txt = (TextBox)this.FindControl("c_" + info[i].ColSysName);
                        str[i] = txt.Text.Trim().Replace("'","");
                        break;

                    case "":
                        DropDownList lst = new DropDownList();
                        lst = (DropDownList)this.FindControl("c_" + info[i].ColSysName);
                        str[i] = lst.SelectedValue ;
                        break;
                }
            }

            //测试输出
            for (int i = ; i < info.Length; i++)
            {
                base.Page.Response.Write(str1[i]);
                base.Page.Response.Write(":");
                base.Page.Response.Write(str[i]);
                base.Page.Response.Write("<BR>");

            }

            return "";

        }

    4、修改的时候显示数据。

        这个部分还没有写呢,不过也是类似的方法。

    5、调用。

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetNoStore();

        //设置控件的属性
        if (!Page.IsPostBack)
        {
            ControlInfos[] info = new ControlInfos[];
            info[].ColSysName = "NewsName";
            info[].ColName = "新闻标题";
            info[].ControlKind = "";

            info[].ColSysName = "NewsKind";
            info[].ColName = "新闻分类";
            info[].ControlKind = "";

            this.myForm.CtrlInfo = info;
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        myForm.SaveDate();
    }

    缺点。说到缺点嘛,由于这里只是一个雏形,所以缺点是很多的,但是这里写的就是一个“核心”代码,关键代码都在这里面。其他的就是在这个基础上去完善、扩展、优化和美化 。

    1、case 。对控件判断的地方使用了case ,目前也没有其他的更好的方法。

    2、case 里面的代码。这里只是两种控件,最简单的代码,就已经好几行了,多了就不可想象了。虽然case 没有什么办法解决,但是case 里的代码,可以使用接口的方式来分散开。

        就是定义一个接口,在继承系统的控件(比如文本框)实现这个接口,然后表单控件里case的代码就可以简化很多了。

    3、调用的时候需要设置一个结构数组,这个是很烦的,代码行数也是很多的,好像还没有直接设置控件(文本框等)来得方便。对于这一点,我是把这些属性放在了一个配置文件(xml或者数据库)里面,然后在表单控件内部读取属性,自己就可以幅值了,外部只需要设置一个“编号”就可以了(告诉控件读取哪些信息)。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蔡述雄的专栏

包学会之浅入浅出Vue.js:结业篇

本篇我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程。

20.6K33
来自专栏Crossin的编程教室

Python的门面担当

在大多数时候,我们都在黑黢黢的控制台里执行 Python 脚本。这看起来很酷很 GEEK。但对于部分场景下的用户来说,这样就不大美观和人性化了:我们需要交互更方...

2464
来自专栏柠檬先生

移动前端头部标签(HTML5 meta)

在移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析html代码 <!DOCTYPE html>  使用 HTML5 doctype...

2868
来自专栏知无涯

前端必看!各大浏览器 CSS Hack 收集

38213
来自专栏iOSDevLog

scetch入门 第3部分:符号和导出谢谢阅读!

符号非常适合组织您经常重复使用的设计元素。在这个例子中,让我们将袜子猴子图标变成符号。选择图标后,查看顶部菜单栏并选择“创建符号”

730
来自专栏前端说吧

vue - v-model实现自定义样式の多选与单选

来不及研究为什么,我先直接在原来项目上赶紧建了一个test页面,先赶紧实现我的这种设想:

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

MFC ActiveX (ocx)控件的开发

前言 ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。 ActiveX控件是一种实现...

8087
来自专栏前端达人

用 React 构建可复用的设计系统

React 让 web 开发简化了很多。原则上 React 基于组件的模式让代码分解和复用变得更加容易。 然而,开发者并不总是清楚如何跨项目分享他们的组件。在这...

1383
来自专栏数据小魔方

动态图表9|组合框(名称管理器)

今天要跟大家分享的是动态图表9——组合框(名称管理器)! 其实看过最近8篇推送的小伙伴儿大概都能看出来了,我所讲的动态图表制作技巧是沿着这样的思路来的: 数据有...

4069
来自专栏河湾欢儿的专栏

React入门

React 是一个用于构建用户界面的 JAVASCRIPT 库。 起源: React 起源于 Facebook 的内部项目,因为该公司对市场上所有 Java...

1461

扫码关注云+社区

领取腾讯云代金券