在我的Database2Sharp中,Web界面生成的代码都集成了查询控件、分页控件、页面展示控件,这几个控件可以简化很多代码,而且统一了风格,熟悉使用后,对开发Web具有不可估量的作用。
下面介绍下几个控件的功能和使用方法:
查询控件
1. 根据设定的字段属性在界面呈现相应的说明及控件
2. 支持下拉列表之间的联动,支持输入数据的验证操作。
3. 支持查询历史记录记忆功能
4. 支持日期控件的集成
5. 支持移动省公司界面样式集成
查询控件属性说明:
SearchFields 查询字段属性集合
SortFieldName 排序字段名称
ConnectionString 数据库链接字符串
ColumnWidth 每个字段表格部分显示的宽度,0表示不设置
InSQL 指定查询表初始部分的脚本
OutSQL 传出的参数化SQL语句
PagerParameters 和参数化SQL语句对应的参数集合
RowControls 每行放置多少控件
ContentControlWidth 所有控件展示为相同长度
SearchButtonImage 查询按钮的图片(可选)
ResetButtonImage 重置按钮图片(可选)
SearchButtonText 查询按钮文本(默认为“查询”)
ResetButtonText 重置按钮文本(默认为“重置”)
AppendedButtons 在查询按钮附近追加的按钮
FieldInfo属性说明(默认使用前三个属性即可):
FieldName 数据库字段名称
ViewName 字段的显示名称
FieldType 字段类型
DefaultValue ListItem类型的默认值(用于下拉列表)
Items 列表项目ListItem[]数组
Enabled 控件是否可用(默认为True)
TargetFieldName 联动时候的字段名称(用来定位联动的DropDownList)
OnFillItem 用于添加联动列表内容的委托函数
ColumnSpan 字段在布局中占多少个单元格
控件一般使用说明:
1.页面代码
Code
<%@ Register TagPrefix="cc1" Namespace="WHC.SearchControl" Assembly="SearchControl" %>
<cc2:SearchControl ID="SearchControl1" runat="server" Width="100%" RowControls="3"
InSQL="SELECT * FROM tb_acl_Roles" SearchButtonImage="http://www.cnblogs.com/Themes/Default/btn_search.gif"
ResetButtonImage="http://www.cnblogs.com/Themes/Default/btn_reset.gif"></cc2:SearchControl>
2.页面后台代码
Code
protected void Page_Load(object sender, EventArgs e)
{
this.Pager1.PageRecords = this.PageSize;
if (!IsPostBack)
{
FieldInfo name = new FieldInfo("Name", "角色名称", FieldType.String);
FieldInfo remark = new FieldInfo("Remark", "角色备注", FieldType.String);
this.SearchControl1.SearchFields = new FieldInfo[] { name, remark };
this.SearchControl1.SortFieldNames = "ID";//"ID";
this.SearchControl1.ConnectionString = Helper.GetConnectionString();
this.SearchControl1.ColumnWidth = new Unit[]{ Unit.Percentage(10), Unit.Percentage(23), Unit.Percentage(10),
Unit.Percentage(23), Unit.Percentage(10), Unit.Percentage(23) }; //设置列的宽度
Helper.SetSearchControlStyle(SearchControl1);//设置控件样式
this.SearchControl1.ContentControlWidth = Unit.Pixel(180); //所有控件使用一个宽度
BindData();
}
this.SearchControl1.OutSQLValueChanged += new OutSQLChangedHandle(SearchControl1_OutSQLValueChanged);
}
private void BindData()
{
try
{
this.Pager1.ConnectionString = this.SearchControl1.ConnectionString;
this.Pager1.PagerParameters = this.SearchControl1.PagerParameters;
this.Pager1.SQL = this.SearchControl1.OutSQL;
}
catch (Exception ex)
{
Helper.ShowError(this, ex, false);
return;
}
}
protected void SearchControl1_OutSQLValueChanged(object sender, OutSQLChangedEventArgs e)
{
BindData();
}
如果是需要下拉列表的联动操作,实现也很方便,下拉列表联动介绍(城市和地区的联动例子):
Code
private void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
FieldInfo cityInfo = new FieldInfo("City", "城市", FieldType.String);
cityInfo.Items = new ListItem[] { new ListItem("北京市", "北京"), new ListItem("广州"), new ListItem("成都") };
cityInfo.TargetFieldName = "Area";
cityInfo.OnFillItem += new AddItemHandler(this.OnFillItem);
FieldInfo areaInfo = new FieldInfo("Area", "地区", FieldType.String);
areaInfo.Items = new ListItem[0];
}
}
private void OnFillItem(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.SearchControl1.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));
}
分页控件
和查询控件以及内置的Datagrid控件一起使用,可以实现功能:
1、可以进行分页(首页、上一页、下一页、末页),跳转到指定页面、数据导出功能等
2、支持表格头部排序功能,Datagrid支持表格样式迭代变化功能。
3. 支持移动省公司界面样式集成
4. 支持页面的页码和页面数量的数字记忆,
编辑控件属性说明:
BindControlID 数据源控件,DataGrid的ID
ExportEnabled 是否显示导出按钮
ImageBasePath 图片地址的基础路径
ConnectionString 数据库连接字符串
PagerParameters 参数化集合
SQL 分页SQL语句
控件使用说明:
1.页面代码
Code
<cc1:Pager ID="Pager1" runat="server" Height="20" BindControlID="dg" ImageBasePath="http://www.cnblogs.com/Themes/Default"
FirstImagePath="btn_sy.gif" NextImagePath="btn_xyy.gif" PreviousImagePath="btn_syy.gif"
LastImagePath="btn_wy.gif" GoImagePath="btn_go.gif" ExportImagePath="btn_export.gif"
ExportEnabled="false" />
2.页面后台代码:
Code
private void Page_Load(object sender, EventArgs e)
{
if(!this.IsPostBack)
{
BindData();
}
}
private void BindData()
{
try
{
this.Pager1.ConnectionString = this.SearchControl1.ConnectionString;
this.Pager1.PagerParameters = this.SearchControl1.PagerParameters;
this.Pager1.SQL = this.SearchControl1.OutSQL;
}
catch (Exception ex)
{
Helper.ShowError(this, ex, false);
return;
}
}
//DataGrid样式变化代码
protected void dg_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem
|| e.Item.ItemType == ListItemType.EditItem)
{
//修改控件的值代码部分
}
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem ||
e.Item.ItemType == ListItemType.EditItem)
{
e.Item.Attributes.Add("onmouseover", "this.className='HighLightItem'");
}
if (e.Item.ItemType == ListItemType.Item)
{
e.Item.Attributes.Add("onmouseout", "this.className='Item'");
}
else if (e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Attributes.Add("onmouseout", "this.className ='AlternatingItem'");
}
}
//排序头部处理
protected void dg_ItemCreated(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
for (int i = 0; i < dg.Columns.Count; i++)
{
if (dg.Columns[i].SortExpression == this.SearchControl1.SortFieldNames)
{
TableCell c = e.Item.Cells[i];
if (c.Controls.Count > 0 &&
c.Controls[0].GetType().ToString() == "System.Web.UI.WebControls.DataGridLinkButton")
{
Label lblArrow = new Label();
lblArrow.Font.Name = "Webdings";
if (this.SearchControl1.SortFieldAscend)
{
lblArrow.Text = "5";
}
else
{
lblArrow.Text = "6";
}
c.Controls.Add(lblArrow);
break;
}
}
}
}
}
//排序部分代码
protected void dg_SortCommand(object source, DataGridSortCommandEventArgs e)
{
if (e.SortExpression == this.SearchControl1.SortFieldNames)
{
if (this.SearchControl1.SortFieldAscend)
{
this.SearchControl1.SortFieldAscend = false;
}
else
{
this.SearchControl1.SortFieldAscend = true;
}
}
else
{
this.SearchControl1.SortFieldNames = e.SortExpression;
this.SearchControl1.SortFieldAscend = true;
}
BindData();
}
页面展示控件
1. 支持查看、增加、编辑三种类型的页面展现
2. 根据设定的字段属性在界面呈现相应的说明及控件
3. 支持布局和样式修改
4. 支持日期控件的集成
5. 支持移动省公司界面样式集成
编辑控件属性说明:
EidtFields 新增或者编辑页面的字段信息
EntityObject 对应的实体类对象
ControlType 标识是新增、编辑还是查看已有的数据,默认为新增
RowControls 每行放置的控件组数目,默认为2个
LabelHorizontalAlign 标签的水平对齐方式
ContentControlWidth 所有控件展示为相同长度
ColumnWidth 列的宽度集合,宽度使用Unit类型
RowHeight 行的高度集合,高度使用Unit类型
ShowMessageBox 界面输入转换错误的时候,是否显示对话框,默认为True
ShowErrorAfter 界面输入转换错误的时候,错误信息是否放在控件的后面,默认为false
OnCancel 处理取消并返回的委托
OnSaveData 处理保存数据的委托
FieldInfo属性说明(默认使用前三个属性即可):
FieldName 数据库字段名称
ViewName 字段的显示名称
FieldType 字段类型
Items DropDownList或者CheckBoxList的列表项目。
ItemsType 下拉列表的类别:DropDownList或者CheckBoxList
DefaultValue ListItem类型的默认值(用于下拉列表)
TargetFieldName 联动时候的字段名称(用来定位联动的DropDownList)
OnFillItem 用于添加联动列表内容的委托函数
IsRequired 字段是否必填项,默认为False (如果是必填项,在界面上要求输入内容)
Enabled 控件是否可用,默认为True
ColumnSpan 字段在布局中占多少个单元格
ToolTip 控件的提示文本(只能设置文本框的提示)
MaxLength 文本框最大可以输入的内容长度
TextBoxMode 文本款的呈现模式,可以是SingleLine、MulitLine、Passord类型
TextRows 多行文本框显示的行数
TextColumns 文本框显示的列字符数
控件使用说明:
1.页面代码
Code
<%@ Register TagPrefix="cc1" Namespace="WHC.EditControl" Assembly="EditControl" %>
<cc1:EditControl id="EditControl1" RowControls="1" ShowErrorAfter="True" ShowMessageBox="True" runat="server" width="100%"
SaveButtonImage="http://www.cnblogs.com/Themes/Default/btn_savetobox.gif" CancelButtonImage="http://www.cnblogs.com/Themes/Default/btn_Cancel.gif"></cc1:EditControl>
2.页面后台代码:
Code
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));
}
}
查询控件、分页控件、页面展示控件的测试项目下载:http://files.cnblogs.com/wuhuacong/MyControlProjects.rar