代码生成工具(3)---占领最后一块黄金宝地

介绍了一种新的代码生成工具,能够自动生成Web界面代码,包括查询、分页、修改、查看和增加等功能,通过三个控件(查询、分页、编辑)与数据库结合,大大提高了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前代码生成工具多如繁星,绝大多数的代码生成工具都是基于数据库进行实体类、数据访问类、部分业务类等的代码生成,较少会用来生成易用、重用的界面代码,因为这块的逻辑很难控制,每个人的需求都不一样,而且把整个界面和业务层结合一起更是困难。界面代码如果不进行封装,代码会多的很难控制。因此很多即使做到界面代码的生成,也只能做了部分关键界面代码和后台控件赋值的代码,我的代码生成工具也做过相关的工作,由于界面部分总体上不是很理想,一直以来都是鸡肋,弃之可惜。

 言归正传,“占领最后一块黄金宝地”的意思就是在界面代码生成这个领域有了很大的突破,将常用的查询、分页、修改、查看和增加等功能用3个控件(查询控件、分页控件、编辑控件)进行了封装,利用我的代码生成工具Database2Sharp通过与数据库字段的信息结合,完整的生成一个网站的界面工程框架,你需要做就是做一些锦上添花的工作就OK,工程越复杂效率提高就更快。

 先来看看不用编写代码而自动生成的界面效果吧

主界面包含查询模块和信息列表分页,同时有查询、增加、删除、查看、编辑等按钮,其中删除按钮内置了删除提示,用户通过实现委托函数即可完成;查询、查看、编辑按钮的实现是不需要操心。
Generator_List.jpg

新增页面中可以设定必填项,指定下拉列表等信息,如果必填项为空,那么如下如图所示的提示信息,这些都是控件实现的功能,用户通过实现保存委托函数即可实现数据的保存。

Generator_Add2.jpg
编辑信息如下图所示,和增加页面相似,但可以设定只读项目,只读项目不可以编辑。
Generator_Modify.jpg

查看页面也是类似,页面只有查看按钮,且数据都不可以编辑。
Generator_View.jpg
以上4个场景的页面是所有Web功能开发中最常见的功能,如果实现这些功能您不需要编码或者只需要编些少代码就可以实现,那么您就可以从辛劳中解脱,获得老板更高的赞赏和荣誉了。
快来吧,使用这三个控件(查询、分页、编辑),通过Database2Sharp辅助,一定可以使你做事事半功倍,节省些精力和时间,来陪陪你身边最关心你的人吧。

Database2Sharp界面代码生成功能演示:

1.  为了配合代码生成,您需要建立数据库表及为每个字段添加合适的描述信息,描述文字将作为界面显示的一部分内容。
2.  下载安装Database2Sharp最新版本(http://www.iqidi.com/),或者在http://files.cnblogs.com/wuhuacong/Database2SharpSetup.rar 下载,然后使用如图所示的Web界面代码生成功能

按照提示一步一步进行设置或者输入,直到整个界面生成,最后可以自动打开界面工程(生成的是VS2005的工程项目,当然这些控件可以应用到.NET 1.1中)。

Generator_Tool1.jpg
Generator_Tool2.jpgGenerator_Tool3.jpg
Generator_Tool4.jpgGenerator_Tool5.jpg
Generator_Tool6.jpg



查询控件属性说明: 
 NormalFields            查询字段属性集合
 RowControls  每行放置多少控件
 RememberValue  是否记录控件的值作为下次显示内容
 NormalSortFieldName 排序字段名称
 ConnectionString 数据库链接字符串
 OutSQL   传出的参数化SQL语句
 PagerParameters  和参数化SQL语句对应的参数集合

 ShowAddNew   是否显示增加按钮
 ShowDelete   是否显示删除按钮
 AppendedButtons  在查询按钮附近追加的按钮

FieldInfo属性说明:
 FieldName  数据库字段名称
 ViewName  字段的显示名称
 FieldType  字段类型
 DefaultValue  ListItem类型的默认值(用于下拉列表)
 TargetFieldName  联动时候的字段名称(用来定位联动的DropDownList)
 AddItem   用于添加联动列表内容的委托函数

..........

控件使用说明:
 1.页面代码

 <cc1:huaweisearcher id="HuaweiSearcher" runat="server" height="25" width="100%" InSQL="SELECT * FROM Test" RowControls="3"></cc1:huaweisearcher>

 2.后台代码 

    private void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FieldInfo nameInfo = new FieldInfo("Name", "姓名", FieldType.String);

            FieldInfo cityInfo = new FieldInfo("City", "城市", FieldType.String);
            cityInfo.Width = 100;
            cityInfo.DefaultValue = new ListItem[] {new ListItem("北京市", "北京"), new ListItem("广州"), new ListItem("成都")};
            cityInfo.TargetFieldName = "Area";
            cityInfo.AddItem = new AddItemHandler(this.AddItem);

            FieldInfo areaInfo = new FieldInfo("Area", "地区", FieldType.String);
            areaInfo.DefaultValue = new ListItem[0];

            FieldInfo manInfo = new FieldInfo("Man", "是否男性", FieldType.Boolean);
            FieldInfo birthInfo = new FieldInfo("Birthday", "出生日期", FieldType.DateTime);
            FieldInfo ageInfo = new FieldInfo("Age", "年龄", FieldType.Numeric);

            this.HuaweiSearcher.NormalFields = new FieldInfo[] {nameInfo, cityInfo, areaInfo, manInfo, birthInfo, ageInfo};
            this.HuaweiSearcher.NormalSortFieldName = "ID";
            this.HuaweiSearcher.ConnectionString = CONNECTION_STRING;
            this.HuaweiSearcher.ColumnWidth = new Unit[]{ Unit.Percentage(10), Unit.Percentage(23), Unit.Percentage(10), 
                                                          Unit.Percentage(23), Unit.Percentage(10), Unit.Percentage(23) }; //设置列的宽度
            this.HuaweiSearcher.LabelHorizontalAlign = HorizontalAlign.Right; //标签对齐方式

            BindData();
        }
    }

    private void BindData()
    {
        this.Pager1.ConnectionString = this.HuaweiSearcher.ConnectionString;
        this.Pager1.PagerParameters = this.HuaweiSearcher.PagerParameters;
        this.Pager1.SQL = this.HuaweiSearcher.OutSQL;
    }

    private void HuaweiSearcher_OutSQLValueChanged(object sender, HuaweiSearcher.OutSQLChangedEventArgs e)
    {
        BindData();
    }

    //下拉列表联动的函数,如选定省份后,地区跟着变化
    private void AddItem(DropDownList ddListControl, string selItemValue)
    {
        ddListControl.Items.Clear();

        if (selItemValue.Trim().Length > 0)
        {
            string sql = string.Format("select Area from CityArea where City ='{0}' ", selItemValue);
            using (SqlConnection connection = new SqlConnection(this.HuaweiSearcher.ConnectionString))
            {
                connection.Open();
                SqlCommand com = new SqlCommand(sql, connection);
                using (IDataReader reader = com.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        ddListControl.Items.Add(new ListItem(reader["Area"].ToString()));
                    }
                }
            }
        }

        ddListControl.Items.Insert(0, new ListItem("--所有--", string.Empty));
    }
    
    
    private void HuaweiSearcher_OnAddNew()
    {
        Response.Redirect("Modify.aspx?type=add");
    }

    private void HuaweiSearcher_OnDelete()
    {
        string idstring = Helper.GetDatagridItems(dg);
        try
        {
            if (idstring != string.Empty)
            {
                string filter = string.Format("ID in ({0})", idstring);
                //test.Delete(filter);
                
                Helper.Alerts(this, idstring);
                return;
            }
        }
        catch (Exception ex)
        {
            Helper.ShowError(this, ex, false);
            return;
        }
        
        Response.Redirect("Default.aspx");
    }


编辑控件属性说明:
 EidtFields  新增或者编辑页面的字段信息
 EntityObject  对应的实体类对象
 ControlType  标识是新增、编辑还是查看已有的数据,默认为新增
 RowControls  每行放置的控件组数目,默认为2个

 ShowMessageBox  界面输入转换错误的时候,是否显示对话框,默认为True
 ShowErrorAfter  界面输入转换错误的时候,错误信息是否放在控件的后面,默认为false 

 OnCancel  处理取消并返回的委托
 OnSaveData  处理保存数据的委托

.........

FieldInfo属性说明:
 FieldName  数据库字段名称
 ViewName  字段的显示名称
 FieldType  字段类型
 DefaultValue  ListItem类型的默认值(用于下拉列表)
 TargetFieldName  联动时候的字段名称(用来定位联动的DropDownList)
 AddItem   用于添加联动列表内容的委托函数
 IsRequired   字段是否必填项,默认为False (如果是必填项,在界面上要求输入内容)
 ToolTip   控件的提示文本(只能设置文本框的提示)
 Enabled   控件是否可用,默认为True
 MaxLength  文本框最大可以输入的内容长度
 TextBoxMode  文本款的呈现模式,可以是SingleLine、MulitLine、Passord类型
 TextRows  多行文本框显示的行数
 TextColumns  文本框显示的列字符数

控件使用说明:
 1.页面代码

 <cc1:editcontrol id="EditControl1" runat="server" width="95%" height="20px"></cc1:editcontrol>

 2.后台代码:

    private const string CONNECTION_STRING = "Server=localhost;Database=Test;uid=sa;pwd=123456";

    private void Page_Load(object sender, EventArgs e)
    {
        if(!this.IsPostBack)
        {
            BindData();
        }
        
        this.EditControl1.OnCancel = new CancelHandler(this.OnCancel);
        this.EditControl1.OnSaveData = new SaveDataHandler(this.OnSaveData);
    }
    
    private void BindData()
    {
        ControlType controlType = GetControlType();
        this.EditControl1.ControlType = controlType;
        if(controlType == ControlType.Add)
        {
            EditControl1.EntityObject = new TestInfo();
        }
        else
        {
            int id = int.Parse(Request.QueryString["ID"]);
            EditControl1.EntityObject = FindByID(id);
        }
        
        FieldInfo nameInfo = new FieldInfo("Name", "姓名", FieldType.String);
        nameInfo.IsRequired = true;
        nameInfo.ToolTip = "请输入用户名称";
        if(controlType != ControlType.Add)
        {
            nameInfo.Enabled = false; //设置“名称”不可编辑
        }

        FieldInfo cityInfo = new FieldInfo("City", "城市", FieldType.String);
        cityInfo.Width = 100;
        cityInfo.DefaultValue = new ListItem[] {new ListItem("北京市", "北京"), new ListItem("广州"), new ListItem("成都"), new ListItem("武汉"),};
        cityInfo.TargetFieldName = "Area";
        cityInfo.AddItem = new AddItemHandler(this.AddItem);

        FieldInfo areaInfo = new FieldInfo("Area", "地区", FieldType.String);
        areaInfo.DefaultValue = new ListItem[0];

        FieldInfo manInfo = new FieldInfo("Man", "是否男性", FieldType.Boolean);
        manInfo.DefaultValue = new ListItem[] {new ListItem("男性", "True"), new ListItem("女性", "False")};
        FieldInfo birthInfo = new FieldInfo("Birthday", "出生日期", FieldType.DateTime);
        birthInfo.IsRequired = true;

        FieldInfo ageInfo = new FieldInfo("Age", "年龄", FieldType.Numeric);

        this.EditControl1.EidtFields = new FieldInfo[] {nameInfo, cityInfo, areaInfo, manInfo, birthInfo, ageInfo};

        this.EditControl1.RowControls = 3; //默认一行放置2个控件组
        this.EditControl1.ContentControlWidth = Unit.Pixel(180);//统一所有控件的长度
        this.EditControl1.ColumnWidth = new Unit[]{ Unit.Percentage(10), Unit.Percentage(20), Unit.Percentage(10), 
                                                    Unit.Percentage(20), Unit.Percentage(10), Unit.Percentage(20) }; //设置列的宽度
    }
    
    private ControlType GetControlType()
    {
        ControlType controlType;
        string type = Request.QueryString["type"];
        switch(type)
        {
            case "view"://查看页面
                controlType = ControlType.View;
                break;
            case "edit"://修改页面
                controlType = ControlType.Edit;
                break;    
            default ://增加页面
                controlType = ControlType.Add;
                break;
        }
        return controlType;
    }

    //您可以使用自己的业务类来获取相关数据
    private object FindByID(int id)
    {
        TestInfo testInfo = new TestInfo();

        string sql = string.Format("select * from test where id ='{0}' ", id);
        using (SqlConnection connection = new SqlConnection(CONNECTION_STRING))
        {
            connection.Open();
            SqlCommand com = new SqlCommand(sql, connection);

            using (IDataReader reader = com.ExecuteReader())
            {
                if (reader.Read())
                {
                    testInfo.ID = Convert.ToInt32(reader["ID"]);
                    testInfo.Name = reader["Name"].ToString();
                    testInfo.Age = Convert.ToInt32(reader["Age"]);
                    testInfo.Area = reader["Area"].ToString();
                    testInfo.Birthday = Convert.ToDateTime(reader["Birthday"]);
                    testInfo.City = reader["City"].ToString();
                    testInfo.Man = Convert.ToBoolean(reader["Man"]);
                }
            }
        }

        return testInfo;
    }

    private void AddItem(DropDownList ddListControl, string selItemValue)
    {
        ddListControl.Items.Clear();

        if (selItemValue.Trim().Length > 0)
        {
            string sql = string.Format("select Area from CityArea where City ='{0}' ", selItemValue);
            using (SqlConnection connection = new SqlConnection(CONNECTION_STRING))
            {
                connection.Open();
                SqlCommand com = new SqlCommand(sql, connection);
                using (IDataReader reader = com.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        ddListControl.Items.Add(new ListItem(reader["Area"].ToString()));
                    }
                }
            }
        }
    }


    private void OnCancel()
    {
        Response.Redirect("Default.aspx");
    }

    /// <summary>
    /// 通过返回用户提交数据的实体类信息,您可以实现自己的新增保存、修改保存操作
    /// </summary>
    /// <param name="entity">新增或者修改的实体类信息</param>
    private void OnSaveData(object entity)
    {
        if (this.EditControl1.ControlType == ControlType.Add)
        {
            //在此保存新增页面的数据
            Response.Write("新增的页面数据:<br>");
            Response.Write(ReflectionUtil.GetProperties(entity));
        }
        else if(this.EditControl1.ControlType == ControlType.Edit)
        {
            Response.Write("编辑的页面数据:<br>");
            Response.Write(ReflectionUtil.GetProperties(entity));
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值