其实添加数据也可以这样简单——表单的第三步抽象(针对UI及后置代码)

终于赶出来了,现写了一遍代码。

感谢大家的支持,感谢大家提出自己的看法。衷心的感谢,真的。

应该是先写第二步的,但是想一想还是先写第三步吧。

一般大项目里面都会有很多的基础信息的表,比如学历、职称等等,最近做了一个项目,居然有四十多个。如果一个一个地写是不是太麻烦了呢?

下面就要介绍一种方法 —— 基本一个页面搞定。

还是先说一下前提吧

VS2003 、 SQL2000 、 webform ,办公系统里的基础信息表的维护。

1、SQL2000里的几个系统表

写过代码生成器的Tx对这几个表都很熟悉吧,sysobjects 、syscolumns 、systypes 。

请打开企业管理器(查询分析器也可以),建立一个视图,粘贴下面的SQL语句,然后保存视图,名字就叫做 V_Sys_TableInfo 吧,后面要用到的哦。

SELECT tbl.name AS TableName, tbl.xtype AS TableType, col.name AS FieldName, 

      tt.name AS FieldType, col.length AS FieldLength

FROM dbo.syscolumns col INNER JOIN

      dbo.sysobjects tbl ON col.id = tbl.id INNER JOIN

      dbo.systypes tt ON col.xtype = tt.xtype

WHERE (tbl.xtype = 'u') AND (tt.name <> N'sysname')

看不懂SQL语句没关系,运行一下看看结果就知道了。你发现了什么?你的数据库里的表名、字段名、字段类型和字段大小。

那么这些信息有什么用呢?请先回顾一下第一步里保存数据都需要哪些元素。表名、字段名、用户输入的信息。

知道我要怎么用了吧,对,就是要通过表名来获取表所拥有的字段名。

2、DataGrid是不是也可以这么用。

开始绘制表单了。一个一个文本框的拖拽是不是挺烦的,那么一起把需要的控件逗弄出来怎么样?

想想上面得到的记录集,是不是可以利用一下呢?

建立一个UserControl ,拖一个DataGrid 出来,设置三列,第一列绑定 FieldName ,第二列空,第三列设置成模版列,放一个文本框。代码如下

<asp:DataGrid id="DG" align="center" runat="server" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"

    BackColor="White" CellPadding="4" ForeColor="Black" AutoGenerateColumns="False">

    <FooterStyle ForeColor="Black" BackColor="#CCCC99"></FooterStyle>

    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#CC3333"></SelectedItemStyle>

    <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#333333"></HeaderStyle>

    <Columns>

        <asp:BoundColumn Visible="False" DataField="FieldName" HeaderText="FieldName"></asp:BoundColumn>

        <asp:BoundColumn DataField="FieldName" HeaderText="字段名"></asp:BoundColumn>

        <asp:TemplateColumn HeaderText="控件">

            <ItemTemplate>

                <FONT face="宋体">

                    <hbs:HBSTextBox id="Txt" runat="server" Columns="30"></hbs:HBSTextBox></FONT>

            </ItemTemplate>

        </asp:TemplateColumn>

    </Columns>

    <PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="White"></PagerStyle>

</asp:DataGrid>

<P>

    <TABLE id="Table1" cellSpacing="1" cellPadding="1" width="100%" align="center" border="0">

        <TR>

            <TD align="center">&nbsp;

                <asp:Button id="Btn_Save" runat="server" Width="70px" Text=" 确 定 "></asp:Button>&nbsp;<INPUT id="Btn_Return" onclick="myEsc()" type="button" value=" 返 回 " name="Btn_Return"></TD>

            </TD></TR>

    </TABLE>

    

</P>

进入后台,绑定DataGrid。想象一下会出现什么样的效果。

运行效果。

先不详细说明了,发代码先。

UserControl 页面 BaseForm.ascx

<%@ Register TagPrefix="HBS" Namespace="HBS.Controls" Assembly="HBSControls" %>

<asp:DataGrid id="DG" align="center" runat="server" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"

    BackColor="White" CellPadding="4" ForeColor="Black" AutoGenerateColumns="False">

    <FooterStyle ForeColor="Black" BackColor="#CCCC99"></FooterStyle>

    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#CC3333"></SelectedItemStyle>

    <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#333333"></HeaderStyle>

    <Columns>

        <asp:BoundColumn Visible="False" DataField="FieldName" HeaderText="FieldName"></asp:BoundColumn>

        <asp:BoundColumn HeaderText="字段名"></asp:BoundColumn>

        <asp:TemplateColumn HeaderText="控件">

            <ItemTemplate>

                <FONT face="宋体">

                    <hbs:HBSTextBox id="Txt" runat="server" Columns="30"></hbs:HBSTextBox></FONT>

            </ItemTemplate>

        </asp:TemplateColumn>

    </Columns>

    <PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="White"></PagerStyle>

</asp:DataGrid>

<P>

    <TABLE id="Table1" cellSpacing="1" cellPadding="1" width="100%" align="center" border="0">

        <TR>

            <TD align="center">&nbsp;

                <asp:Button id="Btn_Save" runat="server" Width="70px" Text=" 确 定 "></asp:Button>&nbsp;<INPUT id="Btn_Return" onclick="myEsc()" type="button" value=" 返 回 " name="Btn_Return"></TD>

            </TD></TR>

    </TABLE>

</P>
public class BaseForm : System.Web.UI.UserControl

    {

        #region Web 窗体设计器生成的代码

        override protected void OnInit(EventArgs e)

        {

            //

            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。

            //

            InitializeComponent();

            base.OnInit(e);

        }

        

        /// <summary>

        ///        设计器支持所需的方法 - 不要使用代码编辑器

        ///        修改此方法的内容。

        /// </summary>

        private void InitializeComponent()

        {

            this.Btn_Save.Click += new System.EventHandler(this.Btn_Save_Click);

            this.Load += new System.EventHandler(this.Page_Load);



        }

        #endregion

        

        protected System.Web.UI.WebControls.Button Btn_Save;

        protected System.Web.UI.WebControls.DataGrid DG;



        DataAccessLayer dal = new DataAccessLayer();

        

        #region 属性

        protected string Kind = "";

        protected string DataID = "";

    

        

        private string _TableName = "";

        /// <summary>

        /// 设置表名,用于添加和修改数据

        /// </summary>

        public string TableName

        {

            get{return _TableName;}

            set{_TableName = value;}

        }

        

        private string _FieldID = "";

        /// <summary>

        /// 设置主键名,用于修改数据

        /// </summary>

        public string FieldID

        {

            get{return _FieldID;}

            set{_FieldID = value;}

        }

        #endregion



        private void Page_Load(object sender, System.EventArgs e)

        {

            // 在此处放置用户代码以初始化页面



        }



        #region 绑定

        public void BindDataGrid()

        {

            this.DG.DataSource = dal.RunSqlDataTable("select * from V_Sys_TableInfo where TableName='" + _TableName + "'");

            this.DG.DataBind();



            //隐藏第一行

            DG.Items[].Visible = false;

        }

        #endregion



        #region 保存

        private void Btn_Save_Click(object sender, System.EventArgs e)

        {

            //保存数据



            string[] str1 = new string[DG.Items.Count - ];

            string[] str = new string[DG.Items.Count - ];



            int i = -;

            foreach (DataGridItem item in DG.Items)

            {

                if (i != -)        //掠过第一行

                {

                    //字段名

                    str1[i] = item.Cells[].Text ;        

                    //取值

                    str[i] = ((HBSTextBox)item.Cells[].FindControl("Txt")).TextTrimNone;

                }

                i++;

            }



            #region 保存数据

            switch (Kind )

            {

                case "":

                    //添加时验证是否有相同的记录,代码略。写多了会影响这里的主题

                    //添加数据

                    dal.InsertDataStr(_TableName,str1,str);

                    break;

    

                case "":

                    //修改时验证是否有相同的记录,代码略。写多了会影响这里的主题    

                    //修改数据

                    dal.UpdateData(_TableName,str1,str, _FieldID + " = " + DataID);

                    break;

            }

            #endregion



            #region 检查是否出现异常

            if (dal.ErrorMsg.Length > )

            {

                Functions.PageRegisterAlert(Page,"保存数据的时候出现意外情况,请与管理员联系!");

                return ;

            }



            Functions.PageRegisterAlert(Page,"保存成功!");

            #endregion



        }

        #endregion

    }

表单页面 MoreTable.aspx

<body MS_POSITIONING="FlowLayout">

        <form id="Form1" method="post" runat="server">

            <uc1:BaseForm id="myForm" runat="server" TableName="News"></uc1:BaseForm>

        </form>

    </body>
//请注意这里,在VS2003里面,这行是不会自动出现的,需要手动填写。

        protected JYK.Test.UC.BaseForm myForm;        //用户控件

    

        private void Page_Load(object sender, System.EventArgs e)

        {

            // 在此处放置用户代码以初始化页面

            Response.Cache.SetNoStore();



            if (!Page.IsPostBack)

            {

                myForm.BindDataGrid();

                //把英文的字段名改成中文的

                myForm.DG.Items[].Cells[].Text = "分类";

                myForm.DG.Items[].Cells[].Text = "内容";

                myForm.DG.Items[].Cells[].Text = "标题";

                myForm.DG.Items[].Cells[].Text = "编辑";

                



            }

        }

用户控件只使用一个就可以了。(不知道这算不算抽象)

表单控件是一个页面对应一个数据表,其实也就是设置一下表名,和显示一下字段的中文名。

优点呢:代码少,其他的就不说了。

缺点就很多了:只能用文本框、要单独设置中文名、页面死板不灵活、不够OO,只能单表操作。

不过除了不够OO(准确点说是一点都不OO:)),其他的是都可以改进的。至于怎么改进,如果您感兴趣可以想一想,方法实在是太多了。

ps:我现在写程序并不是用的这种方法,只是思路是一样的。这种方法,是我刚写的,在实际中没有应用过的。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏V站

WORDPRESS插件大全

WordPress博客程序是国外最火最热的一款程序,只要懂点基本的WordPress操作就能自己开发主题,除了能开发强大的主题以外,还有一个强大的功能就是Wor...

9303
来自专栏SDNLAB

Netvirt之流表分析(一):Netvirt介绍

1. 架构 最近在看ODL的netvirt项目,netvirt是一个完整的网络虚拟机化解决方案,几乎可以实现neutron的所有功能,包括FWaaS,VPNaa...

3647
来自专栏DeveWork

制作WordPress“带Gravatar头像评论”小工具(集成主题中、含选项)

最近在进一步折腾WordPress 主题的开发,在侧边栏小工具那里想做一个可独立于主题的、类似插件的带头像评论小工具。通过WordPress 官方文档与一些资料...

2536
来自专栏杨建荣的学习笔记

关于奇怪的并行进程分析(一) (r6笔记第41天)

在使用orabbix进行监控的时候,得益于使用 实时DB time监控的选项,对于几分钟内的性能抖动也能够狠容易的记录下来,而且会把这个监控的结果基本真实反应出...

2927
来自专栏Python小屋

Python版课堂管理系统中使用UDP广播远程关闭客户端程序思路与源码

本文代码来自于我自己使用开发的一套课堂管理系统,界面是用tkinter编写的,教师端界面如图所示: ? 为了防止学生关闭客户端而接收不到屏幕广播,大概3个月前为...

3095
来自专栏bboysoul

linux服务器性能测试脚本serverreview-benchmark

欢迎关注Bboysoul的博客www.bboysoul.com Have Fun

1783
来自专栏NetCore

微信公众平台快速开发框架 For Core 2.0 beta –JCSoft.WX.Core 5.2.0 beta发布

写在前面 最近比较忙,都没有好好维护博客,今天拿个半成品来交代吧。 记不清上次关于微信公众号快速开发框架(简称JCWX)的更新是什么时候了,自从更新到支持.Ne...

2848
来自专栏生信技能树

表达矩阵可视化大全

貌代码被折叠了,大家需要阅读原文才能复制粘贴我代码在Rstudio里面直接运行,几分钟就可以学会15个图的制作! basic visualization for...

4666
来自专栏西城知道

ss-panel-v3-mod魔改版常用审计规则分享分享

前面我们讲了《基于宝塔搭建SS-Panel教程》、《【图文】使用SS-Panel以及怎么部署SSR后端教程》、《SS-Panel魔改面板.config.php文...

1.5K1
来自专栏张戈的专栏

另类SEO分享:利用JS封装iframe躲过搜索引擎的抓取

前言:很多博友不仔细看完内容就直接认为用 iframe 不好之类的云云,而实际上本文就是教你在必须使用 iframe 的时候,该如何躲过搜索引擎的抓取,避免不利...

5486

扫码关注云+社区

领取腾讯云代金券