代码生成工具随笔(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 
    
原文地址:https://www.cnblogs.com/wuhuacong/p/988686.html