📄 webformhandler.cs
字号:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Text;
using System.Web;
using X2Design.Data;
using X2Design;
using System.Collections;
namespace X2Design.Data
{
/// <summary>
/// 处理表单中的数据,提供数据库添加、修改的通用处理过程。
/// 如果提交的数据被委托验证器认为无效则不作任何动作,否则操作完后引发操作完成事件。
/// </summary>
public class WebFormHandler
{
/// <summary>
/// 将需要绑定的控件以object的形式存储在此数组中。
/// </summary>
protected ArrayList alBinderItems=new ArrayList(8);
/// <summary>
/// 数据库连接,提供数据访问层的操作。
/// </summary>
protected X2Design.Data.DbOperHandler doh;
/// <summary>
/// 表示当前的数据库连接类型。
/// </summary>
protected DatabaseType dbType=DatabaseType.OleDb;
/// <summary>
/// 用于存放从数据库中取出的数据记录。
/// </summary>
protected DataTable myDt;
//指示处理的提交数据是否通过验证
/// <summary>
/// 表示当前的操作类型,添加或修改,默认为添加。
/// </summary>
private OperationType _mode=OperationType.Add;
/// <summary>
/// 指定当前的操作类型,可以指定为添加或修改。
/// </summary>
public OperationType Mode
{
get{return _mode;}
set
{
_mode=value;
if(value==OperationType.Add)
{
btnSubmit.Text=AddText;
}
else if(value==OperationType.Modify)
{
btnSubmit.Text=ModifyText;
}
else
{
btnSubmit.Text=UnknownText;
}
}
}
/// <summary>
/// 提交按钮在添加状态下显示的文本。
/// </summary>
public string AddText="添加";
/// <summary>
/// 提交按钮在修改状态下显示的文本。
/// </summary>
public string ModifyText="修改";
/// <summary>
/// 提交按钮在未知状态下显示的文本。
/// </summary>
public string UnknownText="未知";
/// <summary>
/// 从数据库中取数据时的条件表达式。
/// </summary>
private string _conditionExpress=string.Empty;
/// <summary>
/// 存储取得数据的表名称。
/// </summary>
private string _tableName=string.Empty;
/// <summary>
/// 用于存储表单中的提交按钮的引用。
/// </summary>
protected System.Web.UI.WebControls.Button btnSubmit=null;
/// <summary>
/// 指定取得数据的表名称。
/// </summary>
public string TableName
{
set{_tableName=value;}
get{return _tableName;}
}
/// <summary>
/// 指定从数据库中取数据时的条件表达式。
/// </summary>
public string ConditionExpress
{
set{_conditionExpress=value;}
get{return _conditionExpress;}
}
/// <summary>
/// 构造函数。
/// </summary>
/// <param name="_doh">数据库操作对象。</param>
/// <param name="_table">使用的数据表的名称。</param>
/// <param name="_btn">表单中的提交按钮。</param>
public WebFormHandler(X2Design.Data.DbOperHandler _doh,string _table,Button _btn)
{
TableName=_table;
doh=_doh;
dbType=DatabaseType.OleDb;
btnSubmit=_btn;
this.CheckArgs();
if(!btnSubmit.Page.IsPostBack && this.Mode==OperationType.Modify)this.BindWhenModify();
btnSubmit.Click+=new EventHandler(ProcessTheForm);
btnSubmit.Page.PreRender+=new EventHandler(this.Page_PreRender);
}
/// <summary>
/// 需要修改数据时取出数据库中的记录填充到表单中。
/// </summary>
public void BindWhenModify()
{
if(alBinderItems.Count==0)return;
BinderItem bi;
int i=0;
StringBuilder sbSqlCmd=new StringBuilder("select top 1 ");
for(i=0;i<alBinderItems.Count;i++)
{
bi=(BinderItem)alBinderItems[i];
sbSqlCmd.Append(bi.field);
sbSqlCmd.Append(",");
}
sbSqlCmd.Remove(sbSqlCmd.Length-1,1);//去掉多余的一个逗号
sbSqlCmd.Append(" from ");
sbSqlCmd.Append(TableName);
sbSqlCmd.Append(" where 1=1 and ");
sbSqlCmd.Append(this.ConditionExpress);
doh.Reset();
doh.SqlCmd=sbSqlCmd.ToString();
myDt=doh.GetDataTable();
//如果指定记录不存在则抛出异常
if(myDt.Rows.Count==0)throw new ArgumentException("Record does not exist.");
DataRow dr=myDt.Rows[0];
for(i=0;i<alBinderItems.Count;i++)
{
bi=(BinderItem)alBinderItems[i];
bi.SetValue(dr[bi.field].ToString());
}
this.OnBindBeforeModifyOk(System.EventArgs.Empty);
}
/// <summary>
/// 当操作类型为添加时将输入添加到数据库中
/// </summary>
protected void Add()
{
if(!DataValid())return;
if(alBinderItems.Count==0)return;
BinderItem bi;
int i=0;
doh.Reset();
for(i=0;i<alBinderItems.Count;i++)
{
bi=(BinderItem)alBinderItems[i];
//如果是单选按钮且没有选中则跳过这个字段
if(bi.o is MyRadioButton)
{
MyRadioButton mrb=(MyRadioButton)bi.o;
if(mrb.rb.Checked==false)continue;
}
doh.AddFieldItem(bi.field,bi.GetValue());
}
int id=doh.Insert(this.TableName);
this.OnAddOk(new X2Design.Data.DbOperEventArgs(id));
}
/// <summary>
/// 当操作类型为修改时将输入更新到数据库中
/// </summary>
protected void Update()
{
if(!DataValid())return;
if(alBinderItems.Count==0)return;
BinderItem bi;
int i=0;
doh.Reset();
for(i=0;i<alBinderItems.Count;i++)
{
bi=(BinderItem)alBinderItems[i];
//如果是单选按钮且没有选中则跳过这个字段
if(bi.o is MyRadioButton)
{
MyRadioButton mrb=(MyRadioButton)bi.o;
if(mrb.rb.Checked==false)continue;
}
doh.AddFieldItem(bi.field,bi.GetValue());
}
doh.ConditionExpress=this.ConditionExpress;
doh.Update(this.TableName);
this.OnModifyOk(System.EventArgs.Empty);
}
/// <summary>
/// 建立文本框控件到数据库字段的绑定
/// </summary>
/// <param name="tb">需要绑定的文本框对象。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(TextBox tb,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(tb,field,isStringType));
}
/// <summary>
/// 建立下拉框控件到数据库字段的绑定
/// </summary>
/// <param name="ddl">需要绑定的下拉框对象。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(DropDownList ddl,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(ddl,field,isStringType));
}
/// <summary>
/// 建立复选框控件到数据库字段的绑定
/// </summary>
/// <param name="cb">需要绑定的复选框对象。</param>
/// <param name="_value">复选框被选中时对应字段应该填写的值。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(CheckBox cb,string _value,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(new MyCheckBox(cb,_value),field,isStringType));
}
/// <summary>
/// 建立单选框控件到数据库字段的绑定
/// </summary>
/// <param name="rb">需要绑定的单选框对象。</param>
/// <param name="_value">单选框被选中时对应字段应该填写的值。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(RadioButton rb,string _value,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(new MyRadioButton(rb,_value),field,isStringType));
}
/// <summary>
/// 建立Label控件到数据库字段的绑定
/// </summary>
/// <param name="lbl">需要绑定的Label对象。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(Label lbl,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(lbl,field,isStringType));
}
/// <summary>
/// 建立Literal控件到数据库字段的绑定
/// </summary>
/// <param name="ltl">需要绑定的Literal对象。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(Literal ltl,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(ltl,field,isStringType));
}
/// <summary>
/// 建立字符串变量到数据库字段的绑定。
/// </summary>
/// <param name="s">需要绑定的字符串引用。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(ref string s,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(ref s,field,isStringType));
}
/// <summary>
/// 建立一个委托对象到数据库字段的绑定。
/// </summary>
/// <param name="action">委托的名称。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
private void AddBind(Action action,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(action,field,isStringType));
}
/// <summary>
/// 建立一个string类型属性到数据库字段的绑定。
/// </summary>
/// <param name="_o">属性所在的对象。</param>
/// <param name="_propertyName">属性的名称。</param>
/// <param name="field">数据库中对应字段的名称。</param>
/// <param name="isStringType">是否为字符串性质。</param>
public void AddBind(object _o,string _propertyName,string field,bool isStringType)
{
alBinderItems.Add(new BinderItem(new MyProperty(_o,_propertyName),field,isStringType));
}
/// <summary>
/// 检查是否输入了必须的参数,如表名,按钮对象。
/// </summary>
public void CheckArgs()
{
if(TableName==string.Empty)
{
throw new ArgumentException("None table name is specified!");
}
if(btnSubmit==null)
{
throw new ArgumentException("None submit button is specified!");
}
}
/// <summary>
/// 捕获按钮点击事件,处理表单,添加或修改
/// </summary>
/// <param name="sender">触发对象。</param>
/// <param name="e">传递的事件参数。</param>
private void ProcessTheForm(object sender,System.EventArgs e)
{
if(Mode==OperationType.Add)
{
this.Add();
}
else if(Mode==OperationType.Modify)
{
this.Update();
}
else
{
throw new ArgumentException("Unkown operation type.");
}
}
/// <summary>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -