2009-12-02 131 views
5

我定义了一个GridView如下:获取隐藏字段值

<asp:GridView ID="myGridView" AutoGenerateColumns="false" runat="server" 
OnLoad="myGridView_Load" OnRowCommand="myGridView_Command" OnRowEditing="myGridView_RowEditing" OnRowDeleting="myGridView_RowDeleting" DataKeyNames="ID" > 
    <Columns> 
    <asp:BoundField DataField="ID" Visible="false" /> 
    <asp:BoundField DataField="BirthDate" Visible="false" /> 
    <asp:BoundField DataField="FirstName" HeaderText="First Name" /> 
    <asp:BoundField DataField="LastName" HeaderText="Last Name" /> 
    <asp:TemplateField HeaderText="Other"> 
     <ItemTemplate> 
     <asp:LinkButton ID="editLB" runat="server" Text="edit" CommandName="Edit" /> 
     <asp:LinkButton ID="deleteLB" runat="server" Text="delete" CommandName="Delete" /> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

当用户点击编辑按钮,我需要得到BirthDate列的值。要尝试此操作,我尝试了以下操作:

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
    DateTime birthDate = (DateTime)(row.Cells[1].Text); 

    // Does not work 
} 

我知道它与列不可见的事实有关。该列必须隐藏。但我需要得到那个价值—我该怎么做?

回答

9

问题是,当BoundField的Visibility属性设置为false时,该列不会呈现给客户端。解决方法是在TemplateField内使用HiddenField

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:HiddenField ID="HiddenField1" runat="server" 
         Value='<%# Eval("BirthDate") %>' /> 
    </ItemTemplate> 
    <EditItemTemplate> 
     <asp:HiddenField ID="HiddenField1" runat="server" 
         Value='<%# Eval("BirthDate") %>' /> 
    </EditItemTemplate> 
</asp:TemplateField> 
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = GridView.Rows[e.NewEditIndex];  
    HiddenField hidden = (HiddenField)row.Cells[0].FindControl("HiddenField1"); 
    DateTime birthDate = Convert.ToDateTime(hidden.Value); 
} 

EDIT

,上述方法仍呈现在表中的列中,所以你最终用空栏。它的工作原理并不是最好的解决方案,这里隐藏了BirthDate字段,但仍然可以在RowEditing事件处理程序中获得它的值。请记住,BirthDate仍呈现给客户端,只是没有显示。

<style type="text/css"> 
    .hide 
    { 
     display:none; 
    } 
</style> 

<asp:BoundField DataField="BirthDate"> 
    <ItemStyle CssClass="hide"/> 
</asp:BoundField> 
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = GridView1.Rows[e.NewEditIndex]; 
    DateTime birthDate = Convert.ToDateTime(row.Cells[1].Text); 
} 
+0

我想第二个,但它只是墙根价值观和头部仍然存在。我怎么能隐藏标题? (我不能使用visible = false,因为我需要它的数据) – Rapunzo 2012-05-09 15:21:09

+0

设置头css类隐藏 – MattBH 2015-06-26 08:51:34

0

这是一个方法,从基础数据

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
DateTime birthDate = Convert.ToDateTime(DataBinder.Eval(row.DataItem, "BirthDate")); 
} 
+0

我不认为DataItem是在数据绑定上下文外部填充的。 RowEditing事件处理程序内部的DataItem将为空。 – Phaedrus 2009-12-02 15:43:21

2

我做了这样的事情得到的数据(适应你的例子):

string[] keyList = new string[1]; 
keyList[0] = "BirthDate"; 
myGridView.DataKeyNames = keyList; 

然后我绑定具有DataTable的GridView具有名为“BirthDate”的列。该列下的数据将存储在上面指定的DataKeyName下。

以获得所需的价值,我会做这样的事情:

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    DataKeyArray keyList = myGridView.DataKeys as DataKeyArray; 
    if (keyList != null)  
    DateTime birthDate = keyList[e.NewEditIndex];  
} 

我知道这不涉及然而隐藏字段。

+1

DataKeyNames属性用于唯一标识每一行,它应该用于主键。 – Phaedrus 2009-12-02 15:47:57

+0

优秀点。当我使用DataKeyNames时,这正是我用它们的。 – 2009-12-02 15:49:20

0

我会使用Phaedrus建议的hiddenfield建议,然后在你的代码后面;使用这样的事情:

GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate"); 
DateTime birthDate = DateTime.Parse(hfBirthDate.Value); 
5

要隐藏网格中的内容以及页眉,请使用以下代码: 并照常访问该列。GridView.SelectedRow.Cells[index].Text;

<style type="text/css"> 
.hide 
{ 
    display:none; 
} 

<asp:BoundField DataField="MailRoomID" HeaderText="Mailroom ID" ItemStyle-HorizontalAlign="Center" ShowHeader="false" ><ItemStyle CssClass="hide" /><HeaderStyle CssClass="hide"/></asp:BoundField>