【发布时间】:2011-11-10 18:31:26
【问题描述】:
嗨,我有一个网格视图,每行都有一个文本框,我试图获取 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 事件。
我觉得有点奇怪,它对除第一行之外的所有行都有效。
【问题讨论】:
-
你真的想只绑定gridview,如果它是一个回发,通常是反过来做。
-
好吧,我最初通过搜索功能绑定了gridview,但如果gridview未绑定在回发上,则不会触发rowCommand事件。
-
好的,所以我将 MasterPages ContentPlaceHolder EnableViewState 设置为 false,它起作用了。
-
@user:如果它现在可以工作,我建议将您的解决方案添加为答案并稍后接受,或者(因为它非常具体且对其他人没有多大帮助)只需将其删除。
-
在 rowcommand 中进行数据绑定似乎有点奇怪。我一直发现我可以使用 e.CommandArgs 将我需要的东西传递给 rowcommand。这就像放入您的标记中,类似于您已经拥有的 CommandArgument='' 并对您的文本框执行相同的操作。也许让
不确定这是一个帮助,但我发现在模板中使用 findcontrol总是有问题。
标签: c# asp.net .net gridview rowcommand