20100807 学习记录:GridView隐藏列

时间:2021-12-26 00:11:20


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" >
<!-- 后边那些我就不写了 -->


那么,CS代码中获取的方法如下:
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(); 

http://topic.csdn.net/u/20090512/16/ae3e5b83-8315-4222-8302-c2755c71b389.html

 

 


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/