zoukankan      html  css  js  c++  java
  • 动态绑定Gridview带模板列

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

    界面效果如下图:


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

    前台代码:

           <div id="divGvData" runat="server" style="position: relative; top: 0px; left: 0px;
                overflow: auto; 96%; height:410px;">
                <asp: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>
                        <div style="margin: 0 auto; text-align: center;  auto; height: auto">
                            没有查询到数据!</div>
                    </EmptyDataTemplate>
                </asp:GridView>
            </div>
        /// <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从而实时进行修改状态

    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;
                   }
               }
            }
        }
    }

    更新选中:

            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值

      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;
                }
            }
        }


     

  • 相关阅读:
    Stream 常规操作
    Stream Introduction
    那些从阿里巴巴走出的创业牛人们
    码农转型传统行业更容易成功?
    创业者怎么讲故事打动投资人?
    李明远:移动互联网的创业时代
    想当年,那些抄我们试卷的坏分子,如今个个都当了老板.
    为什么说淘宝创业已难赚钱?
    让低版本IE支持Html5的新语义标签
    译文:TypeScript新手指南
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3299565.html
Copyright © 2011-2022 走看看