5

こんにちは、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 イベントは発生しません。

最初の行を除くすべての行で正常に機能するのは少し奇妙だと思います。

4

2 に答える 2

0

私はこれを試してみましたが、うまく動作します.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();
    }

あなたのコードと私のコードを比較してください。

于 2013-11-09T11:35:00.703 に答える
0

テキストボックスからデータを取得するには、以下のコードを記述してテキスト プロパティを設定する必要があります。

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

それは間違いなくテキストボックスから価値を与えます。

いずれにせよ、gridview の datakeynames プロパティを設定することもできます。データキー名については、ここをクリックしてください

于 2013-01-03T06:03:12.120 に答える