动态绑定Gridview带模板列
公司要做一个可以支持4种数据库(<!--数据库类型 (DLL专用) (SQL SERVER) (ORACLE) (ACCESS)(POSTGRE SQL)-->)的并且字段随表字段变化的可选可移动顺序的数据查询展示,通过简单工厂+配置文件即可实现,这里不多解释。点击显示设置,将会读取所有数据表中的字段,从而将需要显示的字段进行配置,并且进行排序,这里可以将需要显示的字段按照顺序写入txt文本文件,然后通过获取需要显示 的字段进行动态绑定。
界面效果如下图:
一、动态绑定需要显示的字段(可控制显示顺序)
前台代码:
<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;
}
}
}
动态绑定Gridview带模板列的更多相关文章
- 向GridView的模板列绑定OnClientClick的函数时出现了奇怪的问题
原文:向GridView的模板列绑定OnClientClick的函数时出现了奇怪的问题 GridView的一个模板列中的内容是按钮,需要实现以下的效果: GridView分页显示数据,点击编辑按钮(模 ...
- asp.net动态添加GridView的模板列,并获取列值
一.动态添加模板列: 1.建立模板列样式: 说明:下边代码可以直接写在aspx文件中,也可以单独建立cs文件:另外,我没有写button.linkButton等控件,意思差不多,不过当需要添加事件时, ...
- GridView 动态添加绑定列和模板列
动态添加绑定列很简单:例如: GridView1.DataSourceID = "SqlDataSource1"; BoundField bf1 = new BoundField( ...
- GridView绑定数据与隐藏指定控件(模板列)
1.1. GridView绑定数据 1) 可以配置SqlDataSource数据源,修改select语句生成框架(不想手动绑定) 2) 删除DataSourceID属性和 ...
- js获取gridview模板列中textbox行列的值
下面一个例子:在gridview中第一列输入数值,第二列输入数值,点击第三列的时候进行计算 求和,如果不符合标记为红色字体. 如图: 代码 : <html xmlns="http:// ...
- dotNet平台模板列中的单选无效的解决方案
最近在grid里添加一个单选列,最开始直接创建一个模板列,然后在模板列里放一个radiobutton.并指定其GroupName.这是radiabutton最常用的方法.但是在Grid里,这样却毫无效 ...
- gridview动态添加列的问题
相信大家也和我一样遇到过这种问题,gridview在生成列的时候当列不确定怎么办?下面分享一下自己的解决方法. 举个列子说明一下. 普通列的添加比较简单. BoundField bf = new Bo ...
- 动态绑定GridView数据源遇到问题
1.GridView中的Button控件响应Command事件的时候出现System.ArgumentException: 回发或回调参数无效, 设置<pages enableEventVali ...
- (原创)带模板的OLE输出EXCEL
其实带模板的OLE输出EXCEL就是将要输出的EXCEL中一些拥有固定值(如标题,表头行等)的单元格先填充好数据和设置好格式后作为模板上传到SAP 中.这样后续在输出EXCEL时只需从SAP中将模板下 ...
随机推荐
- nginx的 CPU参数worker_processes和worker_cpu_affinity使用说明
官方说明: http://wiki.nginx.org/NginxChsHttpMainModule#worker_cpu_affinity http://wiki.nginx.org/NginxCh ...
- 解题报告 HDU1789 Doing Homework again
Doing Homework again Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- 数据结构——二叉树(Binary Trees)
非线性数据结构 二叉搜索树(Binary Search Tree) 树的密度=结点数/高度 二叉树类 #pragma once class stnode { public: int nodeValue ...
- mmc一维下料例子
数据来自维基, 长度 = 5600; l切割长度= {1380, 1520, 1560, 1710, 1820, 1880, 1930, 2000, 2050, 2100, 2140, 215 ...
- 误mlogc.c:32:23: error: curl/curl.h: No such file or directory
出现以下错误: mlogc.c:32:23: error: curl/curl.h: No such file or directory mlogc.c:1091: error: expected ' ...
- android取得所在位置的经纬度
android提供了LocationManager来取得位置,用LocationListener来监听位置的变化 先做一些初始化工作: /** latitude and longitude of cu ...
- map,area标签
map,area标签 <img src ="planets.gif" alt="Planets" usemap ="#planetmap&quo ...
- VS 2013--工程的创建,scanf报错,常用快捷键,行号设置
一.创建一个工程(这里是C++,其他的一样的) 在vs页面上点击 文件-->新建-->项目: 会出现如下界面,自己改名字和存贮位置就可以了 确定,然后点击下一步: 这样就建好了一个工程,然 ...
- activity_main.xml
activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...
- Ubuntu无法进入图形界面及VirtualBox扩容的解决方案
升级Ubuntu 12.04后出现“Ubuntu is running in low-graphics mode?”,无法进入图形界面,而且给了一些选项,发现其他几个都没有用,最终只能使用low-gr ...