こんにちは、RowCommand イベントで値を取得しようとしている各行にテキスト ボックスがあるグリッド ビューがあります。以下のコードは、最初の行を除くすべての行で正常に機能します。最初の行の textbox.text 値は常に空です。
<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 イベントは発生しません。
最初の行を除くすべての行で正常に機能するのは少し奇妙だと思います。