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

界面效果如下图:

动态绑定Gridview带模板列-LMLPHP

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

前台代码:

       <div id="divGvData" runat="server" style="position: relative; top: 0px; left: 0px;
overflow: auto; width: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; width: 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;
}
}
}
05-08 15:51