获取隐藏字段的值

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
}

我知道这与列不可见有关。该列必须被隐藏。但是我需要获取该值——我该如何做到这一点?

6个回答

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);
}

编辑:
上述方法仍然会在表格中呈现该列,因此您最终会得到一个空列。它可以工作,但不是最佳解决方案。以下是一种隐藏 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);
}

我尝试了第二种方法,但它只隐藏了值,标题仍然存在。如何同时隐藏标题?(我不能使用visible=false,因为我需要它的数据) - Rapunzo
将头部的 CSS 类设置为 hide。 - MattBH

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>

2
我曾经做过类似的事情(根据您的示例进行调整):
string[] keyList = new string[1];   
keyList[0] = "BirthDate";  
myGridView.DataKeyNames = keyList;

我随后将GridView与一个名为“BirthDate”的列的DataTable绑定。该列下的数据将存储在上面指定的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
非常好的观点。当我使用DataKeyNames时,那正是我使用它们的原因。 - Jimmy W

1

0

这是从底层数据获取数据的一种方式

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

我认为在数据绑定上下文之外,DataItem没有被填充。在RowEditing事件处理程序内部,DataItem将为空。 - Phaedrus

0
我会使用Phaedrus建议的hiddenfield建议,然后在您的代码后台中使用类似以下的代码:
GridViewRow row = gvUsers.Rows[e.NewEditIndex];
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate");
DateTime birthDate = DateTime.Parse(hfBirthDate.Value);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接