1. 用css隐藏
现在有一个这样的GridView,先看代码:
<asp:GridView ID="gv_Wait" runat="server" AutoGenerateColumns="False" Width="100%" BorderWidth="0px" CellPadding="0" CellSpacing="0" >
<Columns>
<asp:BoundField DataField="TaskID" HeaderText="项目名称" />
<asp:BoundField DataField="PROCESSNAME" HeaderText="流程名称" />
<asp:BoundField DataField="INCIDENT" HeaderText="实例编号" />
<asp:BoundField DataField="STEPNAME" HeaderText="步骤" />
<asp:BoundField DataField="OWNER" HeaderText="当前处理人" />
<asp:BoundField DataField="STARTTIME" HeaderText="开始时间" />
</Columns>
</asp:GridView>
我想在显示的时候,隐藏实例编号这个字段,但是在RowDataBound的事件中,用到该字段,那怎么办呢?
基本思想仍然是用css使得单元格不可见,而不妨碍它的数据绑定,但我的方法却不需要在cs文件中多加一行代码,其思路如下:
(1)设置一个css类:
.hidden { display:none;}
(2)随后在GridView的列编辑对话框中,对需要进行隐藏的列进行设置,分别设置FootStyle,HeaderStyle,ItemStyle的CssClass属性为“hidden”
Ok,这样我们就实现了隐藏列的目的,同时又能保证对其进行数据绑定。
<asp:BoundField DataField="INCIDENT" HeaderText="实例编号">
<HeaderStyle CssClass="hidden" />
<ItemStyle CssClass="hidden" />
<FooterStyle CssClass="hidden" />
</asp:BoundField>
2. 用LinkButton 的CommandArgument为传递的参数值
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowCommand="GridView1_RowCommand" CssClass="gv" Width="100%" CellPadding="0">
<Columns>
<asp:BoundField DataField="c1" HeaderText="广代编号" Visible="False" />
<asp:BoundField DataField="mc" HeaderText="广代名称" />
<asp:BoundField DataField="c2" HeaderText="序号" />
<asp:BoundField DataField="c3" HeaderText="服务团队" /> <asp:TemplateField HeaderText="操作">
<ItemTemplate>
<asp:LinkButton ID="LinkButton6" runat="server" CommandArgument='<%# Eval("c1")+"$"+Eval("c2")+"$"+Eval("c3")%>' CommandName="ck">查看</asp:LinkButton> </ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
//获取传递参数值
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
string str = "";
if (e.CommandName == "xg")
{
str = e.CommandArgument.ToString();
}
}
或者
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" onclick="LinkButton1_Click" CommandArgument=' <%# Eval("id")%>' CommandName="ck" />查看 </asp:LinkButton> </asp:LinkButton> </ItemTemplate>
protected void LinkButton1_Click(object sender, EventArgs e)
{
ClientScript.RegisterStartupScript(this.Page.GetType(), "clientscript", "window.loaction.href='a.aspx?id=" + Convert.ToInt32(((LinkButton)sender).CommandArgument.ToString()) + "'", true);
}
gidview.Rows[e.CommandArgument].Cells[隐藏列].Text
3. GridView控件里边有DataKeyNames的属性 ,把所有不需要显示并且要传递的字段都放这里(多个用逗号分隔)
获取的时候,通过GridView.DataKeys[]来获取DataKeyNames里的隐藏字段值
例如页面上有个GridView控件的名字叫GV
- HTML code
-
< asp:GridView ID ="GV" runat ="server" ShowFooter ="false" GridLines ="both" AutoGenerateColumns ="false" DataKeyNames ="ID,NAME" >
<!-- 后边那些我就不写了 -->
- C# code
-
protected void base_gvMain_OnRowDataBound( object sender, GridViewRowEventArgs e)
{
string id = GV.DataKeys[e.Row.RowIndex][ 0 ].ToString();
string name = GV.DataKeys[e.Row.RowIndex][ 1 ].ToString();
// 这里只是用GridView的数据绑定事件做个例子,放到其他地方也一样,只要考虑传递被点击的行下标就可以了
}
-
用法
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False" Width="960px" DataKeyNames="想要得的到值,加多个">
有多个值时
string S_GUID = GridView1.DataKeys[索引e.RowIndex][0].ToString();
一个时可以用
string S_GUID = GridView1.DataKeys[索引e.RowIndex].value.ToString();
GridView隐藏列取值解决方案
【摘要】
在Asp.net 2.0 中增加了一个新的数据绑定控件:GridView,其目的用来取代Asp.net1.x中的DataGrid控件,但有一点很不爽的是,如果把某列设置为 visible=false,则不会进行数据绑定,也就是说无法直接从GridView中取到这个列内的文本。
【全文】
在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 . DataKeys [ i ][ "id" ]. ToString ();
//通过键值对数据进行处理……
由此可见,GridView提供了新的机制来绑定额外的数据到每一行。这使得可以完全放弃原来DataGrid通过隐藏列来绑定键值的做法,显然, 现在的方案要优雅的多。当然,如果你实在需要在GridView中使用隐藏列并能够进行取值,我上面的方法不防一试,虽然我很难想到有这样的需求^_^
http://cfeng518.blog.163.com/blog/static/17467732200752321728181/