ASP.new GridView获取隐藏列值的几种方法
解决方法:
原文来自:http://www.tzwhx.com/NewShow/newBodyShow/控件_32933.html 作者:lerit
1.隐藏列前获取数据
看这样一个例子(以下均以此为例):用户选择一些查询条件后,点击“查询”按钮。后台需要根据每行中第六列的值是否为1,来设置第三个单元格的背景色为红色。
这种方法中,后台是在按钮的Click事件中,去数据库取记录,然后得到DataTable,最后将它绑定到GridView中。如果我们需要在GridView的RowDataBound事件中取隐藏列的值,则用Visible属性来设置某一列为隐藏,是没问题的。如下代码:
protected void Btn_Query_Click(object sender, EventArgs e)
{ DataTable dt = new DataTable(); dt=ConstructActiveDataTable();//一个取记录的方法 GV.DataSource = dt;
GV.DataBind(); GV.Columns[5].Visible = false;//设置第6列为隐藏 } protected void GV_UpdateData_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.Cells[5].Text.ToString() == "1")//当行中的第六个单元格的值为1时(第六列为隐藏哦)
{
e.Row.Cells[2].BackColor = System.Drawing.Color.Red;//设置行中第三个单元格背景色为红色
}
}
}
为什么这样就可以了呢?其实是利用了在隐藏列之前就把数值取到了,然后最后再隐藏列。因为在Click事件中,当GV.DataBind()后,不是执行了GV.Columns[5].Visible = false,而是立刻触发了RowDataBound事件,等执行完了此事件,才继续回去执行的隐藏列的代码。因此,这类特定问题中,只要利用事件或函数调用的顺序关系,即可避免无法取值的问题。
当然,这一解决方案并非通用,它对代码执行顺序有要求。
2.分别隐藏列中每个单元格
有些时候,我们不想用上面那种手动方式(DataBind())来绑定GridView了,而是使用一些已有的数据源控件,比如:objectdatasource控件。将GridView的DataSourceID指定为objectdatasource控件的ID,则objectdatasource控件指定其SelectMethod属性为一个返回类型是集合类型的函数(比如返回DataTable),就会在后台自动去调用这个函数并绑定(具体方法就不说了)。
那么依然是上面那个应用,根据隐藏列值来设置另一个单元格的背景颜色,上面那个顺序就不可能实现了,因为类似于DataBind的绑定是隐式执行的,虽然他可能也是绑定后立刻触发RowDataBound事件,然后回去执行剩余代码,但是我们不能在剩余代码中再如上面的插入设置列隐藏的代码。因此,依靠控制代码顺序来实现不太可能了,这是第一个问题。另外,还有一个问题(问题提出中所指),就是这个控件比较怪,如果你在用objectdatasource绑定后,设置了一次列的Visible,那么objectdatasource就会重新去绑定一次数据,那么如果隐藏10个列,岂不是要去重新从数据库等数据源重复读十遍数据,这个性能上是不可接受的。
鉴于这两个原因,必须有别的方法来隐藏列。
既然列是由单元格形成的,那么一一隐藏单元格肯定也能达到隐藏的效果,但是隐藏后能否获取到其值呢,经过验证,确实可以。不过要注意,Footer,Header和DataRow中的单元格都需要隐藏哦,否则表格就错位了。隐藏的代码放哪里都可以,建议放在RowDataBound事件中,这样每生成一行就去隐藏相应列即可。
protected void GV_UpdateData_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header || //如果设置gridview不显示Header,就不写这个(否则报错) e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Footer) //如果设置gridview不显示Footer,就不写这个(否则报错) {
e.Row.Cells[5].Visible=false;//设置每一行中第六个单元格为隐藏,达到隐藏第六列的目的 } if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.Cells[5].Text.ToString() == "1")//即使隐藏了,依然可以访问到数值哦
{
e.Row.Cells[2].BackColor = System.Drawing.Color.Red;//设置行中第三个单元格背景色为红色
}
}
}
依然有人认为这代码不够好,有些人不喜欢用事件,另外也担心性能问题,毕竟每一行都要触发这个事件。
3.利用新的属性DataKeys和DataKeyNames
事实上,微软所作的考虑更加周全。针对GridView无法提供行主键的问题,它提供了两个全新的属性:DataKeys和DataKeyNames!其SDK中的描述如下:
DataKeyNames:获取或设置一个数组,该数组包含了显示在 GridView 控件中的项的主键字段的名称。
DataKeys:获取一个 DataKey 对象集合,这些对象表示 GridView 控件中的每一行的数据键值。
也就是说,利用DataKeyNames,可以设置一个多个列,用于作为行的主键字段(这里用主键其实不太合适,因为值时允许重复的),之后利用DataKeys旧可以访问这些列的值了。因此,利用这两个新属性,我们就可以继续使用利用列的Visible属性设置来隐藏列的同时,又可以访问隐藏列的值了。方法如下:
GV.Columns[5].Visible = false;//设置第6列为隐藏
//只需要在设置列为隐藏的地方多加一段代码:
GV.DataKeyNames = new string[] { "stateid_O2" };
//假设第六列的列名为stateid_O2 protected void GV_UpdateData_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (GridView_UpdateData.DataKeys[e.Row.DataItemIndex]["stateid_O2"].ToString() == "1")
//利用这个DataKeys属性来访问隐藏列的值
{
e.Row.Cells[2].BackColor = System.Drawing.Color.Red;//设置行中第三个单元格背景色为红色
}
}
4.利用客户端代码来隐藏列
实际上,我们上面都是在服务器端利用各种方法来隐藏列了,那么这种方法就是服务器端不对列的可见性进行设置,那么显然就不存在无法取值的问题了,那么又要让用户不看到某些列,这就需要客户端的代码css来实现隐藏效果了。可以从上面方法推导出,既可以用css直接隐藏列,也能通过隐藏列的单元格来实现。首先需要一个css:
<style type="text/css">
.hidden { display:none;}
</style>
如果GridView的列是事先确定,也就是通过设计器来添加的,那么只需要在设计时,将相应列的FootStyle,HeaderStyle,ItemStyle的CssClass属性为“hidden” 即可。如下图所示:
当然,如果列是动态的,或者隐藏哪一列只有在绑定后才能确定,那么就必须在后台设置css。设置有两种方法:
一种是设置列的css:
protected void GridView_UpdateData_RowDataBound(object sender, GridViewRowEventArgs e)
{
GV.Columns[5].HeaderStyle.CssClass = "hidden";
GV.Columns[5].ItemStyle.CssClass = "hidden";
GV.Columns[5].FooterStyle.CssClass = "hidden";
}
另一种是设置单元格的css:
protected void GV_UpdateData_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header || //如果设置gridview不显示Header,就不写这个(否则报错) e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Footer) //如果设置gridview不显示Footer,就不写这个(否则报错) {
e.Row.Cells[5].CssClass = "hidden";
}
}
总结:
第一种方法不太通用,要求在隐藏列前就去访问值,这个是一个约束条件。第二种通过服务器端隐藏列中每个单元格来实现效果,效率一般;第三种应该是标准方式,利用新的属性来达到目的,需要熟悉他的用法;最后一种是在客户端进行隐藏,但是数据还是传到客户端了,如果不介意这样一点多出的数据量,这个应该最容易理解和使用。
ASP.new GridView获取隐藏列值的几种方法的更多相关文章
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- django 获取 POST 请求值的几种方法(转)
转载请注明出处:http://hi.baidu.com/leejun_2005/blog/item/9a37a22238f35c5bac34de54.html from:http://stackove ...
- js获取json属性值的两种方法
1.json.XXX 2.json["XXX"] 第二种方法使用场景,当属性值是变量时.如图所示:
- 解决无法获取 GridView 隐藏列值问题
今天遇到了一个要获取GridView隐藏列值的问题,试了好几种方法,要么获取不到,要么获取到了类列的值也隐藏了,但在样式中这一列会多出一块,,但最后找到了一个功能实现而且实现了列完美隐藏的方法和大家分 ...
- 如何取得GridView被隐藏列的值
如何取得GridView被隐藏列的值 分类: ASP.net 2009-06-25 12:47 943人阅读 评论(1 ...
- treeview自动从表中添加标题和列值做目录的方法2
treeview自动从表中添加标题和列值做目录的方法2,该方法是借鉴万一老师的 http://www.cnblogs.com/del/archive/2008/05/15/1114450.html 首 ...
- PHP获取MySql新增记录ID值的3种方法
From: http://www.jb51.net/article/51473.htm 这篇文章主要介绍了PHP获取MySql新增记录ID值的3种方法,一般使用PHP自带函数mysql_insert_ ...
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...
- MYSQL获取自增ID的四种方法
MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...
随机推荐
- 防止线程退出的几种方案-不再while(true)
有时候 调试程序的时候 .我们需要防止程序退出.比如调试一个定时服务. 方法1 while(true) {Thread.Sleep(1000)} 方法 2——(推荐) Well when you do ...
- ORACLE—005:创建JOB(一)
JOB在实际应用中.使用非常多.一般用户定时运行某些函数,存储过程等. 以下看看怎样创建并启动JOB. 比如,使用job定时运行某个存储过程. 存储过程名:Pro_Test_JOB 运行间隔:2小时, ...
- Centos下cacti的安装
介绍 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形.它提供了非常强大的数据和 ...
- jsp地址栏传中文显示乱码解决方法
格式一: 地址栏显示格式:http://localhost:8081/Jsp2/ahref2.jsp?id=32&name=%E7%8E%8B%E4%BA%91%E9%B9%8F 1.修改To ...
- Android ListView动画特效实现原理及源代码
Android 动画分三种,当中属性动画为我们最经常使用动画,且能满足项目中开发差点儿所有需求,google官方包支持3.0+.我们能够引用三方包nineoldandroids来失陪到低版本号.本样例 ...
- Google大牛分享的面试秘籍
我憋了很长时间想写点关于去Google面试的秘籍.不过我总是推迟,因为写出来的东西会让你抓狂.很可能是这样.如果按统计规律来定义“你”的话,这文章很可能让你不爽. 为啥呢?因为啊……好吧,对此我写首小 ...
- unity5 创建material
在material文件夹下 unity5中新创建的material默认如下 开始我不知道贴图应该加在哪儿.于是跳过教程上这一步,直接去选shader: 在这个shader下很明显看到加贴图的地方了: ...
- IIS启用GZIP压缩js、css无效的原因及解决方法
IIS启用GZIP压缩之后,原以为可以压缩所有文件了,包括html.CSS.JS.图片这些文件,但是当我检查的时候,发现并不是这样的,压缩的只有html文件,而CSS.JS并没有压缩 在卡卡网的网站速 ...
- Spring 一二事(9) - xml 形式的 AOP
AOP在spring中是非常重要的一个 在切面类中,有5种通知类型: aop:before 前置通知 aop:after-returning 后置通知 aop:after 最终通知 aop:af ...
- [svc]mousedos网络批量部署xp
小时候对这个东西很好奇,不知道什么原理.一直觉得很好玩.现在研究了下,总结如下 软件的操作步骤很讲究,稍微不慎,则就需要重新来过 知识点: 1,掌握诺顿ghost分区为gh文件 2,学会清理至一个干净 ...