当前位置:编程学习 > C#/ASP.NET >>

GridView 中隐藏列 Visible=false会不能正常取值 ???????

GridView1.Columns[0].Visible = false;
GridView1.Columns[1].Visible = false;
----------------------------
后面取值 
string CompanyID = GridView1.Rows[rowid].Cells[1].Text;
string uid = GridView1.Rows[rowid].Cells[0].Text;
这样会取到空值 ....但要设为true 时则能得到值 ....
我怎样才能把这两列隐藏起来...但也能取到值 ~~~~! --------------------编程问答-------------------- if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
        {
            e.Row.Cells[0].Visible = false;
        } --------------------编程问答-------------------- 当然不能取值。如果Visible=False在生成Gridview数据表格的时候,就根本不会生成出来。你怎么取值?隐藏列用这个方法:
 Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        '所有行显示控制
        If e.Row.RowType <> DataControlRowType.Pager Then
            Try
                '昵称
                e.Row.Cells(2).Style("display") = "none"
...
... --------------------编程问答-------------------- 对,隐藏后取不到值,你可以去百度看看有很多例子,或者前两位也可以 --------------------编程问答-------------------- try:

GridView1.Columns[0].width=0; --------------------编程问答-------------------- protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //用CSS 隐藏列  
        e.Row.Cells[3].Style.Add("display", "none")
        for (int i = 16; i <= 28; i++)
        {
            e.Row.Cells[i].Style.Add("display", "none");
        }
    } --------------------编程问答-------------------- 这个:
http://www.x2blog.cn/supnate/?tid=7037 --------------------编程问答-------------------- 设计中添加绑定列时钩上“不可见”复选框 --------------------编程问答-------------------- 你的隐藏方式就错了,应该是这样的
<asp:BoundColumn Visible="False"
这样你隐藏的列也能取到值了
--------------------编程问答-------------------- width=0可以 --------------------编程问答-------------------- 用css隐藏 --------------------编程问答-------------------- 將要取的隱藏字段放在自定義模板中 --------------------编程问答-------------------- GridView 中隐藏列 Visible=false会
======
1。
这是一个已知的问题。

DataGrid 不存在此问题。

GridView 的所谓某些“优化”就是包括这个,因为 vivible=false, 它认为不需要呈现,就不必备获取(实际上执行一个反射计算,反射需要一个比较大的开销)此列的值。

2。

使用  Eray(黑桃六) 的方法当然是可以的,通过设置 css 样式控制,但是存在安全性问题,因此数据还是呈现到了客户端。


width=0可以 多数情况下是不可以了,多数浏览器依然会呈现出来,不按 width=0 呈现

3。
一般用法,应该优先考虑使用 GridView.DataKeys 存储

确实需要通过隐藏列,GridView 只有使用模板列的

// .aspx
<asp:TemplateField HeaderText="NewProductName"  Visible="true">
                    <ItemTemplate>
                        <asp:label ID="lblProductName" runat="server" Text='<%# Eval("ProductName") %>' />
                    </ItemTemplate>
                </asp:TemplateField>

        
// .aspx.cs
// 访问指定行
Response.Write(((Label)GridView1.Rows[0].FindControl("lblProductName")).Text);

// RowBound 事件
Response.Write(((Label)e.Row.FindControl("lblProductName")).Text);


--------------------编程问答-------------------- protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        e.Row.Cells[0].Visible = false;


    }
Jinglecat(晓风残月 >> 问题需简洁,错误要详细) 说的很详细,应优先使用DataKeyNames --------------------编程问答-------------------- 隐藏了取不到值的. --------------------编程问答-------------------- 用GridView的DataKeys

<asp:GridView ID="GridView" runat="server" DataKeyNames="字段名称1,字段名称2" />
//取值时
string strValue = GridView.DataKeys[e.RowIndex]["字段名称"].ToString(); --------------------编程问答-------------------- lizh0103 的方法也是可以的,学到了,呵呵

事实上,实际项目中,我几乎没有用 
GridViewRow.Cells[cellIndex].Text
以及
GridViewRow.Cells[cellIndex].Controls 
的方式访问,

因为 cellIndex 是一个索引值,意味着,如果你添加、删除GridView/DataGrid 的列时,此值就需要修改,保证同步,N 烦啊

我更喜欢,使用模板列
GridViewRow.FindControl("MyControlID")
与索引访问相比,对牺牲一定的性能,但是这是完全可以忽略的

对于 GridView.DataKeys 可以存储多个键值,更是优先选择之
--------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 有道理  用模板列就能找到了 不用BoundColumn --------------------编程问答-------------------- 是可以獲取值的,和正常顯示一樣獲取,只是每次在綁定時,必須先讓該隱藏列顯示然後在綁定。 --------------------编程问答-------------------- protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false;
}

这是事件里面写,肯定能取到值 --------------------编程问答-------------------- protected void GridView2_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
        {
            e.Row.Cells[0].Visible = false;
            e.Row.Cells[1].Visible = false;
            e.Row.Cells[2].Visible = false;
        }
    }
这样的才能隐藏多列... --------------------编程问答-------------------- 是我就把宽设成0 --------------------编程问答-------------------- “卖女孩的小火柴”的方法是对的,谢谢了。 --------------------编程问答-------------------- 不会取不到值啊
在gridview的RowCreated事件中写 e.Row.Cells[11].Visible = false;

然后在 protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
          e.Row.Cells[11].Text 这里是可以取值的             
            
        } --------------------编程问答-------------------- 用CommandArgument也是可以的
在rowcommand里用e.CommandArgument取值处理
--------------------编程问答-------------------- GridView列隐藏后不能取值??  没用过,不知道。经常用DataGrid。  想不到"DataGrid"  "GridView"  "DataGridView" 三者什么关系呢... --------------------编程问答--------------------  protected void GVList_RowDataBound(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[3].Visible = false; 
  } 
  }
  这是迄今为止最简洁的解决方法了。 --------------------编程问答-------------------- 你可以把要隐藏的列中放置一个label控件,把值赋到控件的text属性上,然后在后台代码处理中,查找这个控件,找到控件后取其TEXT值即可

--------------------编程问答-------------------- 设置visible=false的时候,ASP.NET将不会生成这个cell的。

最好的办法是用css控制这个格子(cell)的display=none,这样会生成不过不显示,能实现您的要求 --------------------编程问答-------------------- LZ如果不考虑安全问题。。使用CSS隐藏就好了,。 --------------------编程问答-------------------- --------------------编程问答-------------------- 获取gridview 隐藏列

在Gridview 的 RowCreated事件中书写如下代码:


void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow || 
       e.Row.RowType == DataControlRowType.Header)
   {
    //隐藏第1列
     e.Row.Cells[0].Visible = false;
    //可以根据需要隐藏更多的列
   }        
}因为在RowCreated事件(隐藏)在绑定时候发生,所以这样就即能将数据绑定到列上,又隐藏该列,所以可以访问到隐藏列的值。 protected void gvUnit_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
   { 
    //获取隐藏列的值
    if (e.Row.Cells[1].Text == "xxx")
     {
      //TODO
     }
   }
}
--------------------编程问答-------------------- GridView 是可以获取隐藏字段值 

后置代码
GridViewRow.FindControl( "MyControlID ") 

--------------------编程问答-------------------- 楼上都说了那么多了、我就看看吧 --------------------编程问答--------------------
引用 9 楼 xiahouwen 的回复:
width=0可以


绝对支持这个!
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,