代码改变世界

取得GridView被隐藏列的值方法集合

2012-10-15 10:51  时空印记  阅读(3205)  评论(0编辑  收藏  举报

经常看到有人问“如何取得GridView被隐藏列的值?”,当GridView列使用了Visible=false时,数据就不会被加载到表格中了,自然也取不到值了。但是我们就是想要取这个隐藏列的值该怎么办呢?通常我的作法是把该隐藏值设置为主键,然后再获得,但是有时候不想设置成主键了?不急,想想方法总比问题多。 总结有以下几种方法:

一: 主键解决
设置GridView你需要隐藏的字段 Visible=false,再设定GridView的DataKeyNames="你想要隐藏的列ID"。例如: 
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" DataSourceID="SqlDataSource1" >

<Columns> 
<asp:BoundField DataField="EmployeeID" HeaderText="UserID" ReadOnly="True" SortExpression="EmployeeID" Visible ="false" />
<asp:BoundField DataField="age" HeaderText="age" SortExpression="age" />

</Columns>  

</asp:GridView>

或者cs设置: GridView1.DataKeyNames = new[] {"EmployeeID"};//单个主键可 var keyId=GridView1.DataKeys[e.RowIndex].Value.ToString()

多主键值: GridView1.DataKeyNames = new[] {"EmployeeID,UserID"};//获取var keyId=GridView1.DataKeys[e.RowIndex]["EmployeeID"].ToString()

二:CSS解决
设置一个Css类: 
 .hidden { display:none;} 
随后在GridView的列编辑对话框中,对需要进行隐藏的列进行设置,分别设置FootStyle,HeaderStyle,ItemStyle的CssClass属性为“hidden” Ok,这样我们就实现了隐藏列的目的,同时又能保证对其进行数据绑定。 
  
三: 编码解决
1)  在GridView中设置该列的Visible为True,然后在RowCreated事件中设置隐藏,这样就能取到隐藏列的值了。例如:

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)    

{         

    if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)                            

    { 

       e.Row.Cells[0].Visible = false;              

     }     

 } 

然後在RowDataBound事件中,一樣可以利用Row.Cells的方式找到它

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 

    { 

        if (e.Row.RowType == DataControlRowType.DataRow) 

        { 

           string aa = e.Row.Cells[1].Text; 

        } 

    } 

原因很简单因为RowCreated事件在DataBinding事件之后所以它在bind以後才被隐藏所有你在RowDataBound就可以找到数据了。

2) 第二种方法看起来似乎比第一种方法好(此方法本人没验证过,是他人的使用方法)

直接在.ASPX里面把某个值设置隐藏(Visible = False),然後直接指定DataItem的方式去找到它,需要在RowDataBound事件写以下code

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 

    { 

        if (e.Row.RowType == DataControlRowType.DataRow) 

        { 

             Boolean draft = Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, "draft")); 

            if (draft == true

                e.Row.ForeColor = System.Drawing.Color.Green; 

        } 

    } 

以上的code是把draftx栏位转换成布尔值,然后判断去对该ROW

3)此外还有第三种方法:

在Gridview的RowDataBound事件下写如下CODE:

            if(e.Row.RowType==DataControlRowType.Header)
            {
                e.Row.Cells[6].Visible = false;//先设置需要隐藏的头部栏位
            }
            if(e.Row.RowType==DataControlRowType.DataRow )
            {
                var nstatus = DataBinder.Eval(e.Row.DataItem, "nstatus").ToString();//这是Cells[6]对应的绑定字段 
                if(nstatus=="1") //1 for 3 month range
                {
                    e.Row.Cells[3].ForeColor = Color.Blue; 
                }
                e.Row.Cells[6].Visible = false;//再把绑定行栏位隐藏
            }

 

至于以上方法先后顺序,纯看个人喜好了。