zoukankan      html  css  js  c++  java
  • 代码生成工具随笔(3)占领最后一块黄金宝地

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

     言归正传,“占领最后一块黄金宝地”的意思就是在界面代码生成这个领域有了很大的突破,将常用的查询、分页、修改、查看和增加等功能用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/),或者在https://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(
    0new 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));
            }

        }




    相关文章:

          代码生成工具随笔(1) ---关于代码生成器

    代码生成工具随笔(2) ---我的生成工具

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    Java笔记(十六)……内部类
    pmm系列~基础函数
    redis基础篇~性能问题
    redis基础篇~big-key
    mysql基础~经典题目二
    (转)STORM启动与部署TOPOLOGY
    (转)项目经理怎么当
    专注力的一点体会
    163源报错Hash Sum mismatch 解决方法
    mapreduce.framework.name
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/988686.html
Copyright © 2011-2022 走看看