注册 登录
编程论坛 ASP.NET技术论坛

GridView问题隐藏列问题

fququ 发布于 2007-01-07 15:18, 4594 次点击

在vs2005的Gridview控件中把id列隐藏了,就取不出值来了,
问一下.如何做到把某一列隐藏并能取值值来?
也就是如何让GridView在服务器与客户端传递隐甚藏的GridView列中的数据.

我查了下msdn上说的方法不行.(如果 Visible 属性为 false,则不显示数据值并且不做到客户端的往返行程。如果要往返不可见字段的数据,请将字段名添加到数据绑定控件的 DataKeyNames 属性。)
我添加到了DataKeyNames,可取不出来.可能我使用错了?
知道的能否提供点代码.谢谢,

25 回复
#2
bygg2007-01-07 15:20
看一下你的代码...
#3
fququ2007-01-07 15:25

我想我的意思表达的很明白了吧.有代码的或知道的兄弟给看下.

#4
summoner2007-01-08 14:47
要不你就在某一模板列里面加上一个隐藏控件用来绑定id值
#5
zjhm2007-01-10 11:28

添加一个事件
#region 隐藏gridview的ID列
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
{
e.Row.Cells[0].Visible = false;
}
}
#endregion

#6
YSKING2007-01-10 12:23
隐藏列嘛。不就是把那一列的列宽设为0不就行了
这样,它的值还是存在的

[此贴子已经被作者于2007-1-10 12:24:21编辑过]

#7
fququ2007-01-10 13:30
5,6楼的.你们在vs2005中试过吗?
我敢保证你们的方法行不通
#8
小天狼星2007-01-10 13:46
以下是引用zjhm在2007-1-10 11:28:42的发言:

添加一个事件
#region 隐藏gridview的ID列
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
{
e.Row.Cells[0].Visible = false;
}
}
#endregion

这个好像应该会出问题吧……
应该是e.Columns[0].Visible = false;才对吧

#9
zjhm2007-01-10 14:10

我用的就是2005,没问题啊!!!

#10
小天狼星2007-01-10 14:38
以下是引用zjhm在2007-1-10 14:10:31的发言:

我用的就是2005,没问题啊!!!

05的变化好大啊

#11
summoner2007-01-10 16:01
5楼的方法应该取不到值,6楼的方法设为0运行后还是有宽度的
#12
summoner2007-01-10 16:13
楼主你既然要用id的值,应该是有一个模板列的吧?你把隐藏控件拖到这个模板里,在GridView的RowDataBound方法里面分别给每列的隐藏控件赋值,或者干脆在html代码里面将隐藏控件的value='<%# Eval("id") %>'(id为要绑定的字段名)
#13
bygg2007-01-10 16:24
用模板列不是很好处理?
#14
YSKING2007-01-11 12:19
不好意思。

那就用模板列,然后把那一列的“可见”的那个勾去掉就行了,应该05的差不多吧
#15
fququ2007-01-11 16:53
谢谢各位.我用模板列试试吧.
#16
zklwzh2007-01-13 21:21

用模板列可以 的。我在05下已经实现了

#17
fququ2007-02-24 16:23

终极解答...呵,从网上搜到的

在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中使用隐藏列并能够进行取值,我上面的方法不防一试,虽然我很难想到有这样的需求^_^

#18
ruanjian21102008-07-03 21:48
[bo][un]zjhm[/un] 在 2007-1-10 11:28 的发言:[/bo]

添加一个事件 #region 隐藏gridview的ID列   
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)   
{      
 if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataCon ...


找了好久终于找到了,5楼兄弟的方法是正确的,可以取到值,谢谢了。。。。。
 protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {   //隐藏不必要的列
        if ((e.Row.RowType == DataControlRowType.DataRow) || (e.Row.RowType == DataControlRowType.Header) || (e.Row.RowType == DataControlRowType.Footer))
        {
            e.Row.Cells[0].Visible = false;
            e.Row.Cells[1].Visible = false;
            e.Row.Cells[2].Visible = false;
            e.Row.Cells[3].Visible = false;
        }

    }
再次感谢你。。。。。。。
#19
冰彩虹2008-07-03 22:15
有必要整得像你们那么复杂吗

方法一:把你绑定ID的那一列变成模板列,然后利用FindControl或是Controls[0]获取模板列里的控件,该控件的Text就是你想要的了

方法二:如果你绑定GridView的数据源里ID不可重复,是可以填充在GridView的DataKeys属性里的,然后row.DataKeys[index].Value就是你想要的
#20
雪雨星风2008-07-04 09:04
看下这个
<ItemTemplate>
<asp:CheckBox runat="server" ID="ckOne" UID='<%# Eval("userID") %>' OnCheckedChanged="ckOne_CheckedChanged" AutoPostBack="True"/>
</ItemTemplate>
前台放的CheckBox给它绑定了个ID  不显示的
WebControl control = sender as WebControl;
int id = Convert.ToInt32(control.Attributes["UID"]);
#21
fgg2879582702008-07-09 20:46
我用的objectdatasource,然后自定义列,然后吧隐藏列也就是你说的id和DataKeyNames绑定,能取出值。
#22
andyfxd2008-07-11 22:19
DataKeyNames
把id和一些其他要读取的数据都放到DatakeyNames里,读取的时候就GridView1.SelectedDataKey.Values[index],这样就可以得到数据了!
#23
xf128393562008-07-12 13:23
是隐藏了就不能取值吗?
    我怎么把一列隐藏了还可以传ID的啊
#24
寂寞的刺猬2008-07-19 00:53
虽然隐藏了,但是依然可以取到值的。
#25
blueskyss2008-07-20 19:14
问题很简单嘛!!
其实楼主基本找到正解了!
有事问MSDN是对的!!!!
#26
xyq7018302008-07-24 14:46
this.gridview.colunms[要隐藏的列].visible = false
1