2009-12-02 273 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>