ASP.NET GridView RowCommand TextBox empty

5

你好,我有一个包含每行文本框的网格视图,并尝试在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();
        }
}

上述代码已经被简化以便说明。每一行实际上都包含一个子网格视图,这就是为什么需要在每一行中用到文本框。我担心页面加载时的绑定会覆盖文本框的值,然而,如果没有页面加载时的绑定,行命令事件将不会触发。
我发现对于除第一行之外的所有行,它都可以正常工作,这让我感到有点奇怪。

5
你真的想要仅在页面回传(postback)时绑定GridView吗?通常做法是相反的。 - Ben Robinson
好的,我将MasterPages的ContentPlaceHolder的EnableViewState设置为false,然后它就起作用了。 - user346443
1
@user:如果现在它能够正常工作,我建议您将您的解决方案添加为答案并稍后接受它,或者(因为它非常具体且对其他人没有太大帮助)直接删除它。 - Tim Schmelter
你的问题不是很清楚,bindGridView() 方法包含 GridView1.datasource 和 GridView1.databind 还是更多?你第一次是如何填充 gridview1 的? - Masoumeh Karvar
GridView 定义中使用 DataKeyNames 属性会极大地提升您的生活质量。 - Alex Kudryashev
显示剩余2条评论
2个回答

0

我尝试了这个,它很好用,GridView1_OnRowCommand会在点击LinkButtonAddPost时触发:

 <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();
    }

将你的代码与我的进行比较。


0

要从文本框中获取数据,您必须首先通过以下代码设置文本属性。

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

它肯定会从文本框中返回值。

无论如何,您还可以设置gridview的datakeynames属性。单击此处以获取datakeynames


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接