封裝jQuery表格外掛程式jqGrid,控制項化jqGrid(三):查詢,編輯,修改,刪除

來源:互聯網
上載者:User

上兩篇:

封裝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了。

設定檔自動產生在分頁檔所在目錄,產生會判斷是否有設定檔,有則讀,無則產生後再讀。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.