上兩篇:
封裝jQuery表格外掛程式jqGrid,控制項化jqGrid(一):顯示
封裝jQuery表格外掛程式jqGrid,控制項化jqGrid(二):顯示
本文將編碼錶格的動作功能,查詢,編輯,修改和刪除,並在文末附上源碼,供大家參考,一起討論,希望可以拋磚引玉!
一,在jqGrid.cs控制項主體類中加入屬性,用於控制這些功能的開關
#region 動作按鈕 private bool _search = false; private bool _add = false; private bool _edit = false; private bool _del = false; [Description("是否可查詢,預設否")] public bool Search { get { return _search; } set { _search = value; } } [Description("是否可添加,預設否")] public bool Add { get { return _add; } set { _add = value; } } [Description("是否可編輯,預設否")] public bool Edit { get { return _edit; } set { _edit = value; } } [Description("是否可刪除,預設否")] public bool Del { get { return _del; } set { _del = value; } } #endregion
相應的,需要在構造jqGrid頁面JS時,構造相應的JS指令碼,代碼大家自己下源碼可以看到。
二,做完了控制項類,現在開始資料提供類的編碼,這也是最核心的。
1)查詢
可以用firebug看到jqGrid查詢時,使用的是get方式,所以用Request.QueryString的方式取得控制項傳過來的值
看到傳來的的_search參數控制項查詢的開關,當值為true時,查詢開啟
本控制項僅使用複合查詢的方式,並且預設使用“包含”,“大於等於”和“小於等於”,前者符合大部分的通用查詢的要求,後者使得查詢處理更簡單些
其形式如:{"groupOp":"AND","rules":[{"field":"email","op":"cn","data":"1"},{"field":"orderno","op":"ge","data":"2"}]}
使用複合查詢時,傳過來的查詢值是以json的方式包含在filters參數中的,因此,要使用其值,需要對其值進行JSON的還原序列化,這裡使用DataContractJsonSerializer,需要在類中using System.Runtime.Serialization.Json,工程中也要加入其引用,其核心代碼如下:
//還原序列化json string conditions = HttpUtility.UrlDecode(context.Request.QueryString["filters"].ToString()); var mStream = new MemoryStream(Encoding.UTF8.GetBytes(conditions)); //解決中文亂碼問題 //var mStream = new MemoryStream(Encoding.Unicode.GetBytes(conditions)); DataContractJsonSerializer dcjson = new DataContractJsonSerializer(typeof(jqGridFilter)); jqGridFilter filters = (jqGridFilter)dcjson.ReadObject(mStream); //jqGridFilter filters = (jqGridFilter)dcjson.ReadObject(mStream);
另外,還需要建立一個類,用於對應還原序列化
[DataContract] class jqGridFilter { //{"groupOp":"AND","rules":[{"field":"email","op":"cn","data":"1"},{"field":"orderno","op":"ge","data":"2"}]} private string groupOp = "AND"; private List<jqGridFilterRules> jqGridFilterRulesList; [DataMember(Name="groupOp")] public string GroupOp { get { return groupOp; } set { groupOp = value; } } [DataMember(Name = "rules")] public List<jqGridFilterRules> JqGridFilterRulesList { get { return jqGridFilterRulesList; } set { jqGridFilterRulesList = value; } } } [DataContract] class jqGridFilterRules { private string field; private string op; private string data; [DataMember(Name = "field")] public string Field { get { return field; } set { field = value; } } [DataMember(Name = "op")] public string Op { get { return op; } set { op = value; } } [DataMember(Name = "data")] public string Data { get { return data; } set { data = value; } } }
注意類名上的DataContract聲明和參數中的形如[DataMember(Name="groupOp")]的聲明,這是還原序列化所必須的,具體的大家可以搜尋一下,這裡就不做詳細說明了
以上就完成了查詢條件方面的參數分析和清理,現在對這些東東進行資料庫互動
if (filters.GroupOp == "AND") { foreach(jqGridFilterRules rules in filters.JqGridFilterRulesList) { switch (rules.Op) { case "cn": searchCase += " and " + rules.Field + " like '%" + rules.Data + "%'"; break; case "ge": searchCase += " and " + rules.Field + ">='" + rules.Data + "'"; break; case "le": searchCase += " and " + rules.Field + "<='" + rules.Data + "'"; break; default: break; } } } else { searchCase += " and (1<>1"; foreach (jqGridFilterRules rules in filters.JqGridFilterRulesList) { switch (rules.Op) { case "cn": searchCase += " or " + rules.Field + " like '%" + rules.Data + "%'"; break; case "ge": searchCase += " or " + rules.Field + ">='" + rules.Data + "'"; break; case "le": searchCase += " or " + rules.Field + "<='" + rules.Data + "'"; break; default: break; } } searchCase += ")"; }
注意到or條件時,searchCase += " and (1<>1"這樣的形式,這個小技巧,大家可以在sql中自己試試看,這樣可以解決拼接SQL條件時or開頭的問題,在第一篇中還有1=1的形式,同樣的,也是可以解決and開頭的問題。這個是我師傅教的,自認為是一個很牛比的小技巧。
查詢至些就OVER了。
2)編輯,刪除,添加
在設計控制項之初,就為這個編輯傷腦筋,每個表的欄位都不一樣,類型也不一樣,用反射嗎,不靈活,也好麻煩,不能控制項到細部
用entity framework吧,這個好,自動取到post過來的值,自動更新model,不過要依賴entity,更不通用。
後來想到配置用XML,問題一通百通,不管是表體的呈現靈活還是資料提供類的方面,都可以解決掉。
此三個功能都是使用post方式傳遞各項值,瞭解這點以後就很方便了,直接拼接SQL就可以完成這三個功能,很簡單
#region 添?加ó,?修T改?,?刪?除y case "edit": string tableName = context.Request.QueryString["tablename"].ToString(); string idKey = string.Empty; string oper = context.Request.Form["oper"].ToString(); string xmlPath = System.AppDomain.CurrentDomain.BaseDirectory + tableName + ".xml"; StringBuilder sb; XmlDocument xmlDoc = new XmlDocument(); XmlNodeList xnList = xmlDoc.SelectNodes("root//columns"); xmlDoc.Load(xmlPath); foreach (XmlNode xn in xnList) { if (xn.Attributes["IsIdentity"] != null) { idKey = xn.Attributes["name"].Value; } } switch (oper) { case "edit": sb = new StringBuilder(); sb.Append("update " + tableName + " set "); foreach (XmlNode xn in xnList) { if (xn.Attributes["IsIdentity"] == null || xn.Attributes["IsIdentity"].Value == "False") { if (context.Request.Form[xn.Attributes["name"].Value].ToString() != string.Empty) { if (xn.Attributes["sorttype"].Value == "int" || xn.Attributes["sorttype"].Value == "float") { sb.Append(xn.Attributes["name"].Value + "=" + HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + ","); } else { sb.Append(xn.Attributes["name"].Value + "='" + HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + "',"); } } } } sb.Remove(sb.Length - 1, 1); sb.Append(" where id=" + context.Request.Form[idKey].ToString()); SqlHelper.ExecuteNonQuery(sb.ToString()); break; case "add": sb = new StringBuilder(); StringBuilder fieldstr = new StringBuilder(); StringBuilder valuestr = new StringBuilder(); foreach (XmlNode xn in xnList) { if (xn.Attributes["IsIdentity"] == null || xn.Attributes["IsIdentity"].Value == "False") { if (context.Request.Form[xn.Attributes["name"].Value].ToString() != string.Empty) { fieldstr.Append(xn.Attributes["name"].Value + ","); if (xn.Attributes["sorttype"].Value == "int" || xn.Attributes["sorttype"].Value == "float") { valuestr.Append(HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + ","); } else { valuestr.Append("'" + HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + "',"); } } } } fieldstr.Remove(fieldstr.Length - 1, 1); valuestr.Remove(valuestr.Length - 1, 1); sb.Append("insert into " + tableName + " ("); sb.Append(fieldstr.ToString()); sb.Append(") values ("); sb.Append(valuestr.ToString()); sb.Append(")"); SqlHelper.ExecuteNonQuery(sb.ToString()); break; case "del": string sql="delete from "+tableName+" where id="+context.Request.Form[idKey].ToString(); SqlHelper.ExecuteNonQuery(sql); break; default: break; } #endregion
文章有點長了,本來再慢慢寫的,不過這幾天很忙,一次寫完吧,還是那句話,希望可以拋磚引玉。
這裡是源碼下載:http://files.cnblogs.com/bestfc/AspJqGrid.rar
使用方法:
web.config中加入
<pages> <controls> <add tagPrefix="AllenJqGrid" assembly="AspJqGrid" namespace="AspJqGrid" /> </controls> </pages> <httpHandlers> <add path="data.ashx" verb="*" type="AspJqGrid.AjaxData,AspJqGrid"/> </httpHandlers>
頁面中加入jquery.js和jquery.ui.css後,寫入
<AllenJqGrid:JqGrid ID="MyJqGrid" runat="server" TableName="orders" Search="true" Scroll="true" Add="true" Edit="true" Del="true" />,就OK了。
設定檔自動產生在分頁檔所在目錄,產生會判斷是否有設定檔,有則讀,無則產生後再讀。