目前代码生成工具多如繁星,绝大多数的代码生成工具都是基于数据库进行实体类、数据访问类、部分业务类等的代码生成,较少会用来生成易用、重用的界面代码,因为这块的逻辑很难控制,每个人的需求都不一样,而且把整个界面和业务层结合一起更是困难。如果界面代码如果不进行封装,代码会多的很难控制。因此很多即使做到界面代码的生成,也只能做了部分关键界面代码和后台控件赋值的代码,我的代码生成工具也做过相关的工作,由于界面部分总体上不是很理想,一直来都是鸡肋,弃之可惜。
言归正传,“占领最后一块黄金宝地”的意思就是在界面代码生成这个领域有了很大的突破,将常用的查询、分页、修改、查看和增加等功能用3个控件(查询控件、分页控件、编辑控件)进行了封装,利用我的代码生成工具Database2Sharp通过与数据库字段的信息结合,完整的生成一个网站的界面工程框架,你需要做就是做一些锦上添花的工作就OK,工程越复杂效率提高就更快。
目前代码生成工具多如繁星,绝大多数的代码生成工具都是基于数据库进行实体类、数据访问类、部分业务类等的代码生成,较少会用来生成易用、重用的界面代码,因为这块的逻辑很难控制,每个人的需求都不一样,而且把整个界面和业务层结合一起更是困难。如果界面代码如果不进行封装,代码会多的很难控制。因此很多即使做到界面代码的生成,也只能做了部分关键界面代码和后台控件赋值的代码,我的代码生成工具也做过相关的工作,由于界面部分总体上不是很理想,一直来都是鸡肋,弃之可惜。
言归正传,“占领最后一块黄金宝地”的意思就是在界面代码生成这个领域有了很大的突破,将常用的查询、分页、修改、查看和增加等功能用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.页面代码
<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));
}
}
相关文章:
代码生成工具随笔(1) ---关于代码生成器
代码生成工具随笔(2) ---我的生成工具
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)