代码生成工具随笔(3)---占领最后一块黄金宝地
目前代码生成工具多如繁星,绝大多数的代码生成工具都是基于数据库进行实体类、数据访问类、部分业务类等的代码生成,较少会用来生成易用、重用的界面代码,因为这块的逻辑很难控制,每个人的需求都不一样,而且把整个界面和业务层结合一起更是困难。如果界面代码如果不进行封装,代码会多的很难控制。因此很多即使做到界面代码的生成,也只能做了部分关键界面代码和后台控件赋值的代码,我的代码生成工具也做过相关的工作,由于界面部分总体上不是很理想,一直来都是鸡肋,弃之可惜。
言归正传,“占领最后一块黄金宝地”的意思就是在界面代码生成这个领域有了很大的突破,将常用的查询、分页、修改、查看和增加等功能用3个控件(查询控件、分页控件、编辑控件)进行了封装,利用我的代码生成工具Database2Sharp通过与数据库字段的信息结合,完整的生成一个网站的界面工程框架,你需要做就是做一些锦上添花的工作就OK,工程越复杂效率提高就更快。
先来看看不用编写代码而自动生成的界面效果吧
主界面包含查询模块和信息列表分页,同时有查询、增加、删除、查看、编辑等按钮,其中删除按钮内置了删除提示,用户通过实现委托函数即可完成;查询、查看、编辑按钮的实现是不需要操心。
新增页面中可以设定必填项,指定下拉列表等信息,如果必填项为空,那么如下如图所示的提示信息,这些都是控件实现的功能,用户通过实现保存委托函数即可实现数据的保存。
编辑信息如下图所示,和增加页面相似,但可以设定只读项目,只读项目不可以编辑。
查看页面也是类似,页面只有查看按钮,且数据都不可以编辑。
以上4个场景的页面是所有Web功能开发中最常见的功能,如果实现这些功能您不需要编码或者只需要编些少代码就可以实现,那么您就可以从辛劳中解脱,获得老板更高的赞赏和荣誉了。
快来吧,使用这三个控件(查询、分页、编辑),通过Database2Sharp辅助,一定可以使你做事事半功倍,节省些精力和时间,来陪陪你身边最关心你的人吧。
Database2Sharp界面代码生成功能演示:
1. 为了配合代码生成,您需要建立数据库表及为每个字段添加合适的描述信息,描述文字将作为界面显示的一部分内容。
2. 下载安装Database2Sharp最新版本(http://www.iqidi.com/),或者在https://files.cnblogs.com/wuhuacong/Database2SharpSetup.rar 下载,然后使用如图所示的Web界面代码生成功能
按照提示一步一步进行设置或者输入,直到整个界面生成,最后可以自动打开界面工程(生成的是VS2005的工程项目,当然这些控件可以应用到.NET 1.1中)。
查询控件属性说明:
NormalFields 查询字段属性集合
RowControls 每行放置多少控件
RememberValue 是否记录控件的值作为下次显示内容
NormalSortFieldName 排序字段名称
ConnectionString 数据库链接字符串
OutSQL 传出的参数化SQL语句
PagerParameters 和参数化SQL语句对应的参数集合
ShowAddNew 是否显示增加按钮
ShowDelete 是否显示删除按钮
AppendedButtons 在查询按钮附近追加的按钮
FieldInfo属性说明:
FieldName 数据库字段名称
ViewName 字段的显示名称
FieldType 字段类型
DefaultValue ListItem类型的默认值(用于下拉列表)
TargetFieldName 联动时候的字段名称(用来定位联动的DropDownList)
AddItem 用于添加联动列表内容的委托函数
..........
控件使用说明:
1.页面代码
2.后台代码
{
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.页面代码
2.后台代码:
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) ---我的生成工具
转载请注明出处:撰写人:伍华聪 http://www.iqidi.com