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

   

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

                <asp:Button id="Btn_Save" runat="server" Width="70px" Text=" 确 定 ">asp:Button> <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"> 

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

            TD>TR>

    TABLE>

P>


public class BaseForm : System.Web.UI.UserControl

    

{

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

        override protected void OnInit(EventArgs e)

        

{

            //

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

            //

            InitializeComponent();

            base.OnInit(e);

        }

        

        /**//// 

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

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

        /// 

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

        protected string DataID = "";

    

        

        private string _TableName = "";

        /**//// 

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

        /// 

        public string TableName

        

{

            get

{return _TableName;}

            set

{_TableName = value;}

        }

        

        private string _FieldID = "";

        /**//// 

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

        /// 

        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[0].Visible = false;

        }

        #endregion


        保存#region 保存

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

        

{

            //保存数据


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

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


            int i = -1;

            foreach (DataGridItem item in DG.Items)

            

{

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

                

{

                    //字段名

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

                    //取值

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

                }

                i++;

            }


            保存数据#region 保存数据

            switch (Kind )

            

{

                case "1":

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

                    //添加数据

                    dal.InsertDataStr(_TableName,str1,str);

                    break;

    

                case "2":

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

                    //修改数据

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

                    break;

            }

            #endregion


            检查是否出现异常#region 检查是否出现异常

            if (dal.ErrorMsg.Length > 2)

            

{

                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[1].Cells[1].Text = "分类";

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

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

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

                


            }

        }


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

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


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

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

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

原文地址:https://blog.51cto.com/u_15179455/2729581

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


数组的定义 Dim MyArray MyArray = Array(1‚5‚123‚12‚98) 可扩展数组 Dim MyArray() for i = 0 to 10
\'参数: \'code:要检测的代码 \'leixing:html或者ubb \'nopic:代码没有图片时默认值
演示效果: 代码下载: 点击下载
环境:winxp sp2 ,mysql5.0.18,mysql odbc 3.51 driver 表采用 myisam引擎。access 2003  不同的地方: 
其实说起AJAX的初级应用是非常简单的,通俗的说就是客户端(javascript)与服务端(asp或php等)脚本语言的数据交互。
<% ’判断文件名是否合法 Function isFilename(aFilename)  Dim sErrorStr,iNameLength,i  isFilename=TRUE
在调用的时候加入判断就行了. {aspcms:navlist type=0 } {if:[navlist:i]<6} < li><a href=\"[navlist:link]\" target=\"_top\">[navlist:name]</a> </li>
导航栏调用 {aspcms:navlist type=0}     <a href=\"[navlist:link]\">[navlist:name]</a>
1.引入外部文件: {aspcms:template src=infobar.html} 2.二级下拉菜单 <ul class=\"nav\">
downpic.asp页面:  <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息。Cookies的工作原理是,第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端
很简单,在需要调用的地方用这种模式 {aspcms:content sort={aspcms:sortid} num=17 order=isrecommend}
网站系统使用ACCESS数据库时,查询时怎么比较日期和时间呢?为什么常常比较出来却是错误的呢?比如早的日期比迟的日期大?
str1=\"1235,12,23,34,123,21,56,74,1232\" str2=\"12\" 问题:如何判断str2是否存在str1中,要求准确找出12,不能找出str1中的1235、123、1232
实例为最新版本的kindeditor 4.1.5. 主要程序: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)
用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“中国”、“人民”等关键字并在数据库内进行搜索。看完本文后,你就可以发
首先感谢ASPCMS官网注册用户xing0203的辛苦付出!一下为久忆YK网络转载原创作者xing0203的文章内容!为了让小白更加清楚的体验替换过程,久忆YK对原文稍作了修改!
数据库连接: <% set conn=server.createobject(\"adodb.connection\") conn.open \"driver={microsoft access driver (*.mdb)};dbq=\"&server.mappath(\"数据库名\")
第1步:修改plugins下的image/image.js 找到\'<input type=\"button\" class=\"ke-upload-button\" value=\"\' + lang.upload + \'\" />\',
asp函数: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)