获取隐藏的字段值

时间:2009-12-02 15:14:21

标签: asp.net gridview

我的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 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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 :(得分:2)

我做过类似的事情(适应你的例子):

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

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

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

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

然而,我意识到这并不涉及隐藏的领域。

答案 3 :(得分:1)

查看以下文章,该文章介绍了如何访问GridView不可见列:

http://www.highoncoding.com/Articles/178_Access_GridView_Invisible_Columns.aspx

这个想法基本上是使用TemplateField列而不是BoundColumn。

答案 4 :(得分:0)

这是从基础数据中获取数据的一种方法

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

答案 5 :(得分:0)

我会使用Phaedrus建议的隐藏字段建议,然后在你的代码中;使用这样的东西:

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