【问题标题】:ASP.NET GridView RowCommand TextBox emptyASP.NET GridView RowCommand 文本框为空
【发布时间】: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


【解决方案1】:

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

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

它肯定会从文本框中获得价值。

无论哪种方式,你也可以设置gridview的datakeynames属性。Click here for datakeynames

【讨论】:

    【解决方案2】:

    我试过了,效果很好,GridView1_OnRowCommand 通过点击 LinkBut​​tonAddPost 触发:

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

    把你的代码和我的比较一下。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多