你好,我有一个包含每行文本框的网格视图,并尝试在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>
Code-behind: 代码后台
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();
}
}
上述代码已经被简化以便说明。每一行实际上都包含一个子网格视图,这就是为什么需要在每一行中用到文本框。我担心页面加载时的绑定会覆盖文本框的值,然而,如果没有页面加载时的绑定,行命令事件将不会触发。
我发现对于除第一行之外的所有行,它都可以正常工作,这让我感到有点奇怪。
GridView
定义中使用DataKeyNames
属性会极大地提升您的生活质量。 - Alex Kudryashev