2011-09-05 77 views
5

您好我有一個網格視圖與每個行中的文本框即時嘗試獲取RowCommand事件的值。下面的代碼適用於所有行,期望第一個。第一行的textbox.text值始終爲空。ASP.NET GridView的RowCommand文本框空

<asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_OnRowCommand" > 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       Title <%# Eval("Title")%> 

       <asp:TextBox ID="TextBoxAddPost" runat="server"></asp:TextBox> 

       <asp:LinkButton ID="LinkButtonAddPost" CommandName="AddPost" CommandArgument='<%# Eval("postId") %>' runat="server">Add Post</asp:LinkButton> 

      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

代碼隱藏:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(IsPostBack) 
     bindGridView(); 
}  

protected void GridView1_OnRowCommand(object sender, GridViewCommandEventArgs e) 
{ 
     if (e.CommandName == "AddPost") 
     { 
       GridViewRow row = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer); 

       TextBox textBox = (TextBox)row.FindControl("TextBoxAddPost"); 

       //Empty for first row but works for all others 

       Debug.WriteLine("row: " + row.RowIndex + ", textBox:" + textBox.Text.Trim()); 

       GridView1.DataBind(); 
     } 
} 

上述代碼已被簡化用於說明目的。每一行實際上都包含一個子網格視圖,因此爲什麼需要每行中的文本框。我擔心page_load中的綁定會覆蓋文本框的值,但是,如果沒有page_load綁定,rowCommand事件不會被觸發。

我發現我有點奇怪,它適用於除第一個以外的所有行。

+5

你真的想綁定gridview只有它是一個回發,它通常是反過來做。 –

+0

那麼我最初通過搜索函數綁定gridview,但是如果gridview沒有綁定在回發的rowCommand事件不會被觸發。 – user346443

+0

好吧,所以我將MasterPages ContentPlaceHolder EnableViewState設置爲false,並且它工作正常。 – user346443

回答

0

要從文本框中獲取數據,您必須首先通過放置下面的代碼來設置文本屬性。

<asp:TextBox ID="TextBoxAddPost" runat="server" Text='<%# Eval("Title") %>'></asp:TextBox> 

它肯定會給文本框的價值。

無論哪種方式,您還可以設置gridview的datakeynames屬性。 Click here for datakeynames

0

我想這和它工作正常,通過點擊LinkBut​​tonAddPost GridView1_OnRowCommand火災:

<asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand"> 
      <Columns> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:TextBox ID="TextBoxAddPost" runat="server" Text='<%# Eval("ID") %>'></asp:TextBox> 
         <asp:LinkButton ID="LinkButtonAddPost" CommandName="AddPost" CommandArgument='<%# Eval("ID") %>' runat="server">Add Post</asp:LinkButton> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 

,改變你的Page_Load事件是這樣的:

protected void Page_Load(object sender, EventArgs e) 
    { 
     GridView1.DataSource = Data.RequestPaymentDB.GetRequestPaymentByRequestID(9208060001); 
     GridView1.DataBind(); 
    } 

與我比較你的代碼。