⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webformhandler.cs

📁 x2webcontrols
💻 CS
📖 第 1 页 / 共 2 页
字号:
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 + -