ASP.NET GridView RowCommand TextBox пусто - PullRequest
       10

ASP.NET GridView RowCommand TextBox пусто

5 голосов
/ 05 сентября 2011

Привет. У меня есть сетка с текстовым полем в каждой строке, в котором я пытаюсь получить значение в событии 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 не запускается.

Мне немного странно, что он отлично работает для всех строк, кроме первой.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2013

Я попробовал это, и он отлично работает, 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 голосов
/ 03 января 2013

Для получения данных из текстового поля, вы должны сначала установить свойство текста, указав следующий код.

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

Это определенно даст значение из текстового поля.

В любом случае, вы также можетеустановить свойство datakeynames для gridview. Нажмите здесь для ввода datakeynames

...