当前位置: 移动技术网 > IT编程>开发语言>.net > 动态绑定Gridview带模板列

动态绑定Gridview带模板列

2018年09月20日  | 移动技术网IT编程  | 我要评论

偏偏喜欢你 意阑,普法栏目剧虎头铡,厉家菜传人

公司要做一个可以支持4种(<!--数据库类型 (dll专用) (sql server) (oracle) (access)(postgre sql)-->)的并且字段随表字段变化的可选可移动顺序的数据查询展示,通过简单工厂+配置文件即可实现,这里不多解释。点击显示设置,将会读取所有数据表中的字段,从而将需要显示的字段进行配置,并且进行排序,这里可以将需要显示的字段按照顺序写入txt文本文件,然后通过获取需要显示 的字段进行动态绑定。

界面效果如下图:

 

一、动态绑定需要显示的字段(可控制显示顺序)

前台代码:

[html]  

<p id="pgvdata" runat="server" style="position: relative; top: 0px; left: 0px;  

     overflow: auto; width:96%; height:410px;">  

     <:gridview id="gvequdata" runat="server" cssclass="usertableborder" onrowcreated="gvequdata_rowcreated"  

         allowsorting="true" datakeynames="samid" onrowdatabound="gvequdata_rowdatabound"  

          onsorting="gvequdata_sorting"   

         onprerender="gvequdata_prerender">  

         <headerstyle cssclass="freezing" />  

         <emptydatatemplate>  

             <p style="margin: 0 auto; text-align: center; width: auto; height: auto">  

                 没有查询到数据!</p>  

         </emptydatatemplate>  

     </asp:gridview>  

 </p>  

 

[csharp]  

/// <summary>  

    /// 绑定gridview查询数据  

    /// </summary>  

    public void bindgridviewdata()  

    {  

        getwebconfiginfo();  

        initdatainfo();  

  

        try  

        {  

            gridview gridview = gvequdata;  

            gridview.columns.clear();  

            gridview.autogeneratecolumns = false;  

            string[] selectfields = string.isnullorempty(shows) ? null : shows.split(','); //获取所有需要带复选框的列  

  

            boundfield b = new boundfield();  

            b.headertext = "序号";  

            gridview.columns.add(b);  

  

            boundfield bf = new boundfield();  

            bf.headertext = "设备连接状态";  

            bf.datafield = "linkstatu";//固定列  

            gridview.columns.add(bf);  

  

            string[] names = quarrysclass.all.split(',');  

            string newname;  

            if (selectfields == null)  

                return;  

            foreach (string name in selectfields)  

            {  

                newname = name.trim('@').tolower();  

                string colname = resources[newname] == null ? string.empty : resources[newname].tostring();  

                if (quarrysclass.checkflag.tolower().indexof("@" + newname + "@") != -1) //绑定复选框列  

                {  

                  templatefield tf = new templatefield();  

                    if (resources[newname] == null)  

                    {  

                        continue;  

                    }  

                  tf.headertemplate = new gridviewitemtemplate(datacontrolrowtype.header, newname, colname, "checkbox", id);  

                    tf.itemtemplate = new gridviewitemtemplate(datacontrolrowtype.datarow, newname, colname, "checkbox", id);  

                    gridview.columns.add(tf);  

                }  

                else  

                {  

                    if (quarrysclass.converts.tolower().contains(newname)) //转换显示格式  

                    {  

                        templatefield tf = new templatefield();  

                        tf.headertemplate = new gridviewitemtemplate(datacontrolrowtype.header, newname, colname, "", id);  

                        tf.itemtemplate = new gridviewitemtemplate(datacontrolrowtype.datarow, newname, colname, "convert", id);  

                        gridview.columns.add(tf);  

                    }  

                    else //普通列  

                    {  

                        bf = new boundfield();  

                        bf.itemstyle.horizontalalign = horizontalalign.center;  

                        bf.headertext = resources[newname] == null ? string.empty : colname;  

                        bf.datafield = newname;  

                        bf.sortexpression = bf.datafield;  

                        gridview.columns.add(bf);  

                    }  

                }  

            }  

  

            quarrysclass.busno = txtbusno == null ? string.empty : txtbusno.text.trim();  

            quarrysclass.deviceno = txtdeviceno == null ? string.empty : txtdeviceno.text.trim();  

            quarrysclass.lineno = txtlineno == null ? string.empty : txtlineno.text.trim();  

            quarrysclass.resources = resources;  

            equsearchbll.equbll.setgridview(gridview, shows);  

        }  

        catch (exception)  

        {  

  

        }  

  

    }  

 

动态绑定模板列,可以新建一个类gridviewitemtemplate.cs供调用,对于动态绑定的模板列中的textbox,如何在前台通过js获取到,然后一点击选中则通过ajax调用更改状态值是难点,因为你不知道触发的是哪个控件并且更新那个字段的值,这里我通过在动态绑定时,将其id设置为改行的主键值+列名的形式,这样在前台通过监听所有texbox就可以获取到被点击的chexbox从而实时进行修改状态

[csharp]  

using system;  

using system.data;  

using system.configuration;  

using system.web;  

using system.web.security;  

using system.web.ui;  

using system.web.ui.webcontrols;  

using system.web.ui.webcontrols.webparts;  

using system.web.ui.htmlcontrols;  

using xiongdi.common.commonhelper;  

using xiongdi.bizrul;  

using gprs.admin;  

  

namespace gprs  

{  

    public class gridviewitemtemplate : itemplate  

    {  

        private string ctype;  //控件对象的字符串,以此来判断具体创建哪个控件  

        private datacontrolrowtype templatetype;  //当前行的模板 (header,item)  

        private string colname;  //控件要显示的字符,或是绑定数据源的字段列名  

        private string colid; //绑定字段  

        private int ischecked;  

        private int ischeckedall;  

        private int  datatype=convert.toint32(quarrysclass.datatype); //数据库类型  

        private string id; //主键  

  

        /// <summary>  

        /// 是否回发  

        /// </summary>  

        public bool isautopostback{get;set;}  

  

        public string id  

        {  

            get  

            {  

                return id;  

            }  

            set  

            {  

                id = value;  

            }  

        }  

  

        public string idvalue{get;set;}  

         

        public int ischecked  

        {  

            get  

            {  

                return ischecked;  

            }  

            set  

            {  

                ischecked = value;  

            }  

        }  

        /// <summary>  

        /// 是否全部选中  

        /// </summary>  

        public int ischeckedall  

        {  

            get  

            {  

                return ischeckedall;  

            }  

            set  

            {  

                ischeckedall = value;  

            }  

        }  

  

        /// <summary>  

        /// 控件模板  

        /// </summary>  

        /// <param name="rtype">rowtype</param>  

        /// <param name="colid">字段id</param>  

        /// <param name="name">字段名称</param>  

        /// <param name="ctype">模板字段类型</param>  

        /// <param name="id">主键</param>  

        public gridviewitemtemplate(datacontrolrowtype rtype, string colid,string name,string ctype,string id)  

        {  

            isautopostback = true;  

            this.colid = colid;  

            colname = name;  

            templatetype = rtype;  

            this.ctype = ctype;  

            this.id = id;  

        }  

  

        private void texboxclicking(object sender, eventargs e)  

        {  

         checkbox cbx = (checkbox)sender;  

         gridviewrow container = (gridviewrow)cbx.namingcontainer;  

        //关键位置  

        //使用databinder.eval绑定数据  

        //proname,mytemplate的属性.在创建mytemplate实例时,为此属性赋值(数据源字段)  

         cbx.attributes.add("onclick", "alert('" + databinder.eval(container.dataitem, colid).tostring() + "');");  

        }  

  

        public void instantiatein(system.web.ui.control container)  

        {  

            if (templatetype == datacontrolrowtype.header)  

            {  

                if (ctype == "checkbox")  

                {  

                    checkbox cbxall = new checkbox();  

                    //cbxall.autopostback = isautopostback;  

                    //cbxall.attributes.add("onclick", "javascript:return confirm('确定要更新本列数据吗?');");  

                    //cbxall.checkedchanged += new eventhandler(cbxall_checkedchanged);  

                    cbxall.checked = convert.toboolean(equstatussearch.ht[colid]);  

                    cbxall.id = colid;  

                    container.controls.add(cbxall);  

                }  

                literal ltl = new literal();  

                ltl.text = colname;  

                container.controls.add(ltl);  

            }  

            else if (templatetype == datacontrolrowtype.datarow)  

            {  

                if (ctype == "checkbox")  

                {  

                    //hiddenfield hdf = new hiddenfield();  

                    //hdf.id = "hidf" + colid;  

                    //hdf.databinding += new eventhandler(this.hiddenfieldxdatabinding);  

                    //container.controls.add(hdf);  

  

                    checkbox cbx = new checkbox();  

                    //cbx.autopostback = isautopostback;  

                    //cbx.checkedchanged += new eventhandler(cbx_checkedchanged);  

                    cbx.databinding += new eventhandler(cbx_databinding);  

                      

                    container.controls.add(cbx);  

                }  

                else if (ctype == "convert")  

                {  

                    literal lbl = new literal();  

                    lbl.id = "lbl" + colid;  

                    lbl.databinding += new eventhandler(lbl_databinding);  

                    container.controls.add(lbl);  

                }  

            }  

        }  

  

        void cbx_checkedchanged(object sender, eventargs e)  

        {  

            checkbox cbx = (checkbox)sender;  

            ischecked = cbx.checked ? 1 : 0;  

            string strwhere = string.format(" {0}='{1}'", this.id, idvalue);  

            equsearchbll.equbll.updateallchecked(colid, ischeckedall, strwhere);  

        }  

  

        void cbxall_checkedchanged(object sender, eventargs e)  

        {  

           checkbox cbxall= (checkbox)sender;  

           ischeckedall = cbxall.checked ? 1 : 0;  

           cbxall.checked = !cbxall.checked;  

           equsearchbll.equbll.updateallchecked(colid, ischeckedall,string.empty);  

        }  

  

  

        void lbl_databinding(object sender, eventargs e)  

        {  

            label lbl = (label)sender;  

            gridviewrow row = (gridviewrow)lbl.namingcontainer;  

            if (!string.isnullorempty(colid))  

            {  

                lbl.text =commonclass.convertdatetime(databinder.eval(row.dataitem, colid));  

            }  

        }  

  

        void cbx_databinding(object sender, eventargs e)  

        {  

            checkbox cbx = (checkbox)sender;  

            gridviewrow row = (gridviewrow)cbx.namingcontainer;  

           string str=databinder.eval(row.dataitem, colid)==null?string.empty:databinder.eval(row.dataitem, colid).tostring();  

           string id = databinder.eval(row.dataitem, colid) == null ? string.empty : databinder.eval(row.dataitem, id).tostring();  

          cbx.id = "cbx_" + id + "-" + colid; //这里给chexbox的id赋予唯一且包含特殊含义的值  

           if (datatype == (int)enumdatatype.access)  

           {  

               if (str.tolower() == "true")  

               {  

                   cbx.checked = true;  

               }  

               else  

               {  

                   cbx.checked = false;  

               }  

           }  

           else  

           {  

               if (str =="1")  

               {  

                   cbx.checked = true;  

               }  

               else  

               {  

                   cbx.checked = false;  

               }  

           }  

        }  

    }  

}  

 

更新选中:

[javascript]  

        var isreturnstatus = function (data) {  

            if (data > 1) {  

                searchdata();//点击查询按钮  

            }  

        }  

        $(function () {  

            $("td").find("input:checkbox").each(function (key, val) {  

                $(val).click(function () {  

                    var cbxid = $(this).attr("id");  

                    var state = $(this).attr("checked")  

                    $.post("ajax/updatestatus.ashx", { "id": cbxid, "ischecked": state, "fid": "samid" }, isreturnstatus);  

                });  

            });  

            $("th").find("input:checkbox").click(  

                        function () {  

                            if (confirm("确定要更新这一列数据吗?") == true) {  

                                var cbxid = $(this).attr("id");  

                                var state = $(this).attr("checked");  

                                $.post("ajax/updatestatus.ashx", { "id": cbxid, "ischecked": state }, isreturnstatus);  

                            }  

                        });  

        });  

    function searchdata() {  

            var btn = document.getelementbyid("<%=btnquery.clientid %>");  

            btn.click();  

        }  

ajax一般处理文件,用于异步更新选中的checdbox值

[csharp] 

public class updatestatus : ihttphandler  

  {  

      public void processrequest(httpcontext context)  

      {  

          context.response.contenttype = "text/plain";  

          hashtable ht =equstatussearch.ht; //表头选中项状态保持  

          int ischecked = context.request["ischecked"] == "checked" ? 1 : 0;  

          string colid=context.request["id"];  

           

          string name = colid.substring(colid.lastindexof('_')+1, colid.length - colid.lastindexof('_')-1);  

          int result=0;  

  

          if (quarrysclass.checkflag.tolower().indexof("@" + name + "@") != -1)  

          {  

              if (ht.containskey(name))  

              {  

                  ht.remove(name);  

              }  

              if (ischecked == 1)  

              {  

                  ht.add(name, true);  

              }  

              else  

              {  

                  ht.add(name, false);  

              }  

              string selectstr = quarrysclass.strwhere;  

              //控制前台刷新  

              result = equsearchbll.equbll.updateallchecked(name, ischecked, selectstr) == 1 ? 2 : equsearchbll.equbll.updateallchecked(name, ischecked, selectstr);   

          }  

          else  

          {  

              if (name.contains('-'))  

              {  

                  string idname = context.request["fid"];  

                  string[] arrays = name.split('-');  

                  string id = arrays[0];  

                  string fieldname = arrays[1];  

                  string strwhere = string.format(" and {0}='{1}'",idname,id);  

                  result = equsearchbll.equbll.updateallchecked(fieldname, ischecked, strwhere);  

              }  

          }  

           

          context.response.write(result);  

      }  

  

      public bool isreusable  

      {  

          get  

          {  

              return false;  

          }  

      }  

  }  

 

 

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网