ASP.new GridView获取隐藏列值的几种方法

解决方法:

原文来自:http://www.tzwhx.com/NewShow/newBodyShow/控件_32933.html 作者:lerit 

1.隐藏列前获取数据

看这样一个例子(以下均以此为例):用户选择一些查询条件后,点击“查询”按钮。后台需要根据每行中第六列的值是否为1,来设置第三个单元格的背景色为红色。

这种方法中,后台是在按钮的Click事件中,去数据库取记录,然后得到DataTable,最后将它绑定到GridView中。如果我们需要在GridView的RowDataBound事件中取隐藏列的值,则用Visible属性来设置某一列为隐藏,是没问题的。如下代码:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

    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事件中,这样每生成一行就去隐藏相应列即可。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

    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;//设置行中第三个单元格背景色为红色

        }

    }

}

?





1

 

依然有人认为这代码不够好,有些人不喜欢用事件,另外也担心性能问题,毕竟每一行都要触发这个事件。

3.利用新的属性DataKeys和DataKeyNames

事实上,微软所作的考虑更加周全。针对GridView无法提供行主键的问题,它提供了两个全新的属性:DataKeys和DataKeyNames!其SDK中的描述如下:
DataKeyNames:获取或设置一个数组,该数组包含了显示在
GridView 控件中的项的主键字段的名称。
DataKeys:获取一个 DataKey 对象集合,这些对象表示 GridView
控件中的每一行的数据键值。

也就是说,利用DataKeyNames,可以设置一个多个列,用于作为行的主键字段(这里用主键其实不太合适,因为值时允许重复的),之后利用DataKeys旧可以访问这些列的值了。因此,利用这两个新属性,我们就可以继续使用利用列的Visible属性设置来隐藏列的同时,又可以访问隐藏列的值了。方法如下:

?





1

2

3

4

5

6

7

8

    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")

?





1

2

3

4

5

    //利用这个DataKeys属性来访问隐藏列的值

{

   e.Row.Cells[2].BackColor = System.Drawing.Color.Red;//设置行中第三个单元格背景色为红色

 }

}

4.利用客户端代码来隐藏列

实际上,我们上面都是在服务器端利用各种方法来隐藏列了,那么这种方法就是服务器端不对列的可见性进行设置,那么显然就不存在无法取值的问题了,那么又要让用户不看到某些列,这就需要客户端的代码css来实现隐藏效果了。可以从上面方法推导出,既可以用css直接隐藏列,也能通过隐藏列的单元格来实现。首先需要一个css:

?





1

2

3

    <style type="text/css">

   .hidden
{ display:none;}

</style>

如果GridView的列是事先确定,也就是通过设计器来添加的,那么只需要在设计时,将相应列的FootStyle,HeaderStyle,ItemStyle的CssClass属性为“hidden”
即可。如下图所示:

当然,如果列是动态的,或者隐藏哪一列只有在绑定后才能确定,那么就必须在后台设置css。设置有两种方法:

一种是设置的css:

?





1

2

3

4

5

6

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:

?





1

2

3

4

5

6

7

8

9

10

11

12

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

   }

}

总结:

第一种方法不太通用,要求在隐藏列前就去访问值,这个是一个约束条件。第二种通过服务器端隐藏列中每个单元格来实现效果,效率一般;第三种应该是标准方式,利用新的属性来达到目的,需要熟悉他的用法;最后一种是在客户端进行隐藏,但是数据还是传到客户端了,如果不介意这样一点多出的数据量,这个应该最容易理解和使用。

时间: 2024-08-03 15:20:33

ASP.new GridView获取隐藏列值的几种方法的相关文章

获取对象中值的两种方法

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="button" name="" id="btn" value="按钮" /> <input type=&

treeview自动从表中添加标题和列值做目录的方法2

treeview自动从表中添加标题和列值做目录的方法2,该方法是借鉴万一老师的 http://www.cnblogs.com/del/archive/2008/05/15/1114450.html 首先界面上添加treeview组件,然后在treeview的onchange事件里这样写: 因为要用到定义个过程,需要在接口声明里引用 private { Private declarations } /// <summary> /// 刷新左侧treeView /// </summary&g

获取作用域里的值的4种方法

获取作用域里的值的4种方法: 1.java代码: <%request.getAttribute()%> 2.${requestScope/username} 3.<s:property value="#session.username"> 4.不知道作用域时候: <s:property value="#attr.username"/>

asp.net C# 获取网页源码的几种方式

1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text.Encoding.Default; Byte[] pageData = aWebClient.DownloadData(url); string nhtml = Encoding.GetEncoding("utf-8").GetString(pageData); 2方法 System.N

PHP获取MySql新增记录ID值的3种方法

From: http://www.jb51.net/article/51473.htm 这篇文章主要介绍了PHP获取MySql新增记录ID值的3种方法,一般使用PHP自带函数mysql_insert_id() 即可实现,另2种方法权作特殊情况下使用,需要的朋友可以参考下 一.使用语句: 复制代码 代码如下: mysql_query("select max(id) from t1",$link); 使用此方法得到的是 id最大的值,确为最后一个值,但当多链接线程时,这个最大的id并不一定

C#分析URL参数并获取参数和值对应列表的方法

本文实例讲述了C#分析URL参数获取参数和值对应列表的方法.分享给大家供大家参考.具体分析如下: 这个C#函数用于分析url中传递的所有参数,输出一个参数名和参数值对应的NameValueCollection列表,经常能用得到 /// <summary> /// 分析 url 字符串中的参数信息 /// </summary> /// <param name="url">输入的 URL</param> /// <param name=

PHP中获取文件扩展名的N种方法

PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法: function get_extension($file) { substr(strrchr($file, '.'), 1); } 第2种方法: function get_extension($file) { return substr($file, strrpos($file, '.')+1); } 第3种方法: function get_extension($file) { return end(expl

QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast<QRadioButton*>(ui->BG->checkedButton()); 2 QString name = pbtn->objectName(); 3 if(!QString::compare(name, "rad

CSS 隐藏页面元素的 几 种方法总结

用 CSS 隐藏页面元素有许多种方法.你可以将 opacity 设为 0.将 visibility 设为 hidden.将 display 设为 none 或者将 position 设为 absolute 然后将位置设到不可见区域. 你有没有想过,为什么我们要有这么多技术来隐藏元素,而它们看起来都实现的是同样的效果?每一种方法实际上与其他方法之间都有一些细微的不同,这些不同决定了在一个特定的场合下使用哪一个方法.我们只需要记住的细小不同点,根据不同情况选择上面这些方法中适合的方法来隐藏元素. d