GridView隐藏列的问题(隐藏后可以进行数据操作

在cs文件中多加一行代码,其思路如下:
(1)设置一个css类:

 <style>
 .hidden{display:none;}
 </style>

(2)随后在GridView的列编辑对话框中,对需要进行隐藏的列进行设置,分别设置FootStyle,HeaderStyle,ItemStyle的CssClass属性为“hidden”
Ok,这样我们就实现了隐藏列的目的,同时又能保证对其进行数据绑定。

说明

 GridView 是ASP.NET 2.0的新增控件之一,它的出现代替了原有的DataGrid控件.如果你使用过ASP.NET 2.0. 在设计GridView控件时你拖拽了一个Bound Field,那你可能会遇到一个问题.在早期的.NET版本中,如果想要访问一列,但令它不可见,你可以将他的Visible属性设置为false.
 但是这在ASP.NET 2.0时无效的.当一个列的可见性设置为false,控件不会再将数据绑定到该列中,所以你尝试得到隐藏列的值时,只能得到一个空的字符串.
However, this does not work in ASP.Net 2.0. When a column's visibility is set to False, then the Grid does not bind data to the column, and thus when you try to retrieve data from the hidden column, it either blows up or returns an empty string.

 对于开发人员来说这个正是可大麻烦,现在提供一个解决方法,希望对你您会有帮助

条件

 必须拥有Visual Studio 2005 或者 Visual Web Developer Express并对ASP.NET 2.0有一定了解

解决方案

在RowCreated事件中书写如下代码

 void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
 {
 e.Row.Cells[0].Visible = true; //如果想使第1列不可见,则将它的可见性设为false
 //可以根据需要设置更多的列
 }

 因为在RowCreated事件(隐藏)在绑定时候发生,所以这样就即能将数据绑定到列上,又隐藏了该列.所
以可以访问到隐藏列的值

下面介绍另外一个可以将数据绑定到GridView控件的方法

Public void myTestFunction()
{
 string conString="....";//省略
 string sqlquery="...";//省略
 SqlConnection con = new SqlConnection(conString);
 SqlDataAdapter da = new SqlDataAdapter(sqlquery, con);
 DataSet ds = new DataSet();
 da.Fill(ds);
 ds.Tables[0].Columns[0].ColumnMapping = MappingType.Hidden;
 GridView1.DataSouce = ds.Tables[0];
 GridView1.DataBind() ;

}

 

因为其性能我也不大放心,毕竟每一行都要触发一次事件。因而在GridView中仍然不喜欢事件,而且即使vs2005对web标准的支持大大改善,但添加一个事件容易,删除一个事件还是要在两个文件中进行手动删除才能同步,比较麻烦。

就事论事,回到标题,现提供我对这个问题的解决方案,基本思想仍然是用css使得单元格不可见,而不妨碍它的数据绑定,但我的方法却不需要在cs文件中多加一行代码,其思路如下:
(1)设置一个css类:


.hidden { display:none;}

在web标准横行的现在,我想为每个aspx链接一个common.css是基本的素质,呵呵
(2)随后在GridView的列编辑对话框中,对需要进行隐藏的列进行设置,分别设置FootStyle,HeaderStyle,ItemStyle的CssClass属性为“hidden”
Ok,这样我们就实现了隐藏列的目的,同时又能保证对其进行数据绑定。

好了,看到这里,如果你有所收获,并很高兴的马上赶回去,为你的GridView添加此设置,避免了使用事件来隐藏列,并实现了批量删除的功能。那你就大错特错了,呵呵
很可惜的是,在网上看到很多人关于GridView的这个功能的讨论,很大一部分人都是为了这个功能而来的。

是的,在DataGrid中,要实现这个功能,隐藏列来存储键值是必须的,甚至是一个初学者需要摸索才能知道的技巧。然而现在GridView是用来替代DataGrid的,微软所作的考虑更加周全。针对DataGrid无法提供行主键的问题,它提供了两个全新的属性:DataKeys和DataKeyNames!其SDK中的描述如下:
DataKeyNames:获取或设置一个数组,该数组包含了显示在 GridView 控件中的项的主键字段的名称。
DataKeys:获取一个 DataKey 对象集合,这些对象表示 GridView 控件中的每一行的数据键值。

看到这里,也许你会有所明白,针对批量选中操作的问题,我们有了新的方案,现在来看一个简单的实现,假设主键字段是id:

//设置主键字段名称数组,可以多个字段,
//你也可以在设计器中直接设置主键字段,多个字段用逗号隔开
GridView1.DataKeyNames = new string[] { "id" };
这样,当进行数据绑定时,GridView会自动用键值填充DataKeys集合,从而在绑定或者回传后可以通过DataKeys集合来获取某一行的键值,例如假设想获取第i行的id键值,其代码如下:

//获取第i行的id键值,注意该索引即行的索引,从header到footer都算在内
string id=GridViews1.DataKeys[i]["id"].ToString();
//通过键值对数据进行处理……
由此可见,GridView提供了新的机制来绑定额外的数据到每一行。这使得可以完全放弃原来DataGrid通过隐藏列来绑定键值的做法,显然,现在的方案要优雅的多。当然,如果你实在需要在GridView中使用隐藏列并能够进行取值,我上面的方法不防一试,虽然我很难想到有这样的需求^_^

posted on 2010-12-14 13:31  大宝pku  阅读(2280)  评论(0编辑  收藏  举报

导航