在Asp.net 2.0中增加了一个新的数据绑定控件:GridView,其目的用来取代Asp.net1.x中的DataGrid控件,但有一点很不爽的是,如果把某列设置为visible=false,则不会进行数据绑定,也就是说无法直接从GridView中取到这个列内的文本。
这一功能在DataGrid时代几乎是必须的,在对列表进行批量选中操作时非常有用(比如批量删除),隐藏列通常用于存储DataGrid行对应数据记录的关键字的值,而现在在GridView中却行不通,着实令一大批人头疼不已,网上也有了其解决方案,其中一个如下,其原理是在行创建时设置其css样式为不可见,这样可以避免直接设置列的visible=false带来的数据不绑定问题:
void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
//让索引为0的列不可见,实际上是产生的css代码
e.Row.Cells[0].Visible = false;
//other code if neccecary
}
个人认为此方法不够优雅,Asp.net 1.x年代本人就尽量避免使用事件,宁可在数据源DataTable中做循环遍历来进行一些或烦或简的处理。一来因为vs2003对web标准支持欠佳,而我习惯于在Html源码模式下工作,所以为DataGrid添加一个事件是极其麻烦的事情;二来因为其性能我也不大放心,毕竟每一行都要触发一次事件。因而在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中使用隐藏列并能够进行取值,我上面的方法不防一试,虽然我很难想到有这样的需求^_^
分享到:
相关推荐
问题的核心在于,当GridView列设置为Visible=false时,常规的遍历方式可能无法获取到这些隐藏列的值。在C#中,我们通常通过DataKeys属性来获取行的主键值,或者在RowDataBound事件中通过e.Row.Cells[index]访问...
### GridView隐藏列的方法 在开发Web应用程序时,经常会遇到需要对`GridView`控件中的某些列进行隐藏处理的情况。这通常是为了改善用户界面或者保护敏感数据。本文将详细介绍如何通过编程方式来实现`GridView`中...
### GridView隐藏列的方法 在开发Web应用程序时,我们经常需要用到GridView控件来显示数据列表。有时根据业务需求或用户体验考虑,我们需要对GridView中的某些列进行隐藏处理。本文将详细介绍几种在ASP.NET中实现...
### GridView动态隐藏某列 在Web开发中,`GridView`是一种非常常见的用于显示表格数据的控件。在ASP.NET中,`GridView`提供了强大的数据绑定功能,并且支持各种交互操作,如排序、分页等。有时为了适应不同的业务...
显示/隐藏GridView的列源码 介绍: 这篇文章演示如果让用户有显示/隐藏他们需要的GridView的列的功能,这是非常有用的,因为在GridView的所有列并不是每个的用户都需要的.用户想根据自己的需求看到想要的列.而...
ASP.NET开发中,会遇到有些客户提出这样需求,可根据需求编辑GridView列显示以及隐藏,这个用户控件就是为了这个需求而生。 自动从GridView中获取所有Visible=true的列,加入到CheckBoxList,并配合Cookie实现本次...
GridView动态添加模板列知识点汇总 在 ASP.NET 中,GridView控件是最常用的数据展示控件之一,然而,在实际开发中,我们经常需要根据不同的业务需求动态添加模板列,以满足不同的数据展示需求。那么,如何动态添加...
GridView是ASP.NET中一个常用的控件,用于展示数据表格,常用于网页开发。在实际应用中,有时我们需要在用户滚动页面时保持某些列或行始终可见,这...无论是前端还是后端的解决方案,都需要充分考虑用户体验和性能。
### ASP.NET GridView 控件取值方法详解 在ASP.NET Web应用程序开发中,`GridView`控件是用于展示数据集中的数据的一种非常强大的工具。本文将详细介绍如何通过ASP.NET中的`GridView`控件来获取各种数据值,包括但...
显示/隐藏GridView的列源码 介绍: 这篇文章演示如果让用户有显示/隐藏他们需要的GridView的列的功能,这是非常有用的,因为在GridView的所有列并不是每个的用户都需要的.用户想根据自己的需求看到想要的列.而...
为了解决这个问题,我们可以实现“gridview冻结表头和列”的功能,确保表头和特定列在滚动时始终保持固定。 GridView 控件是ASP.NET中的一个强大组件,它允许我们以网格形式显示数据源中的数据,并提供了丰富的...
文章将会演示两种显示和隐藏GridView列的方法,一种是客户端的方法,另外一种是服务段的方法. 在客户段显示和隐藏GridView的列 大部分代码是在GridView的RowCreated事件生成客户端的功能的。当GridView的Header行...
栏位操作涵盖取值与赋值、编辑风格、格式化、固定列、拖动、合计、初始值及可编辑性。其中,各种类型的GridViewColumn满足不同数据展示需求,如命令按钮列、数据列、编辑按钮列、复选框列和文本列。 ### 三十一至四...
本篇文章将深入探讨这个问题及其解决方案。 首先,当试图在GridView中添加新的数据行时,如果数据为空,可能的原因有以下几点: 1. 数据源未正确绑定:确保你的数据源(如DataTable、BindingSource或自定义集合)...
本实例主要关注如何实现GridView的固定表头和列,使得用户在滚动浏览长表格时,表头和部分列始终保持可见,提高用户体验。 GridView冻结表头和列的需求在大数据量展示时尤为重要,因为表头的可见性有助于用户在浏览...
本篇文章将详细讲解如何在ASP.NET中获取Gridview隐藏列的值。 首先,隐藏列的操作通常在GridView的`RowCreated`事件中进行,因为在这个事件中,列已经被创建,但数据还未绑定。下面是一个示例代码: ```csharp ...
在这个“Gridview冻结列.rar”压缩包中,我们主要关注的是如何在Gridview滚动时保持前几列固定不动,也就是实现列冻结的功能。这个功能在大数据量且需要横向滚动的表格中特别有用,因为它能确保用户始终能看到关键列...
控制数据列表显示隐藏的checkbox是竖排显示,我改了横排显示。MedColumnObject用的, //GridViewColumn集合 ObservableCollection<DataGridColumn> collec=new ObservableCollection<DataGridColumn> ();我们控件...