0

既存のグリッドに新しい行を追加しようとすると、値がクリアされます。ビューステートを使用して、ページ全体でDatatableを維持し、グリッドにバインドします。ポストバック中に値がクリアされていると考えてください。

// AddNewRow

int rowIndex = 0;

        if (ViewState["CurrentTable"] != null)
        {
            DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
            DataRow drCurrentRow = null;
            int i;

            if (dtCurrentTable.Rows.Count > 0)
            {
                for (i = 1; i <= dtCurrentTable.Rows.Count; i++)
                {
                    TextBox txtguide = (TextBox)grdreports.Rows[rowIndex].FindControl("txtAccNo");
  drCurrentRow = dtCurrentTable.NewRow();

                    dtCurrentTable.Rows[i - 1]["txtAccNo"] = txtguide.Text;
 rowIndex += 1;

                }
                drCurrentRow = dtCurrentTable.NewRow();
                dtCurrentTable.Rows.Add(drCurrentRow);
                ViewState["CurrentTable"] = dtCurrentTable;
                ViewState["rowcount"] = dtCurrentTable.Rows.Count;
                grdreports.DataSource = dtCurrentTable;
                grdreports.DataBind();

            }
}

// aspxページ:

<asp:GridView ID="grdreports" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateField>
                <HeaderTemplate>
                    S.No</HeaderTemplate>
                <ItemTemplate>
                    <%#Container.DataItemIndex+1 %>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Acc.No/Tel.No">
                <ItemTemplate>
                    <asp:TextBox ID="txtAccNo" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "nvrGuide")%>'></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
 <asp:TemplateField HeaderText="AddNew" ShowHeader="false">
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnAddGuide" runat="server" CommandName="Add" Text="Add New"
                        OnClick="lbtnAddGuide_OnClick"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Delete" ShowHeader="false">
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnDeleteGuide" runat="server" CommandName="Delete" Text="Delete"
                        OnClick="lbtnDeleteGuide_OnClick"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

どこが間違っているのですか?

4

2 に答える 2

1

私の推測では、名前は異なります。

つまり、名前

`Text='<%#DataBinder.Eval(Container.DataItem, "nvrGuide")%>'` 

.aspxページで指定されているのは「nvrguide」ですが、.csページでの名前は

TextBox txtguide = (TextBox)grdreports.Rows[rowIndex].FindControl("txtAccNo");

「txtAccNo」です。したがって、.csページで空のグリッドとしてバインドした値は.aspxページとは異なると思います。

両方のページで同じように変更してください。

おそらく、これに対してエラーがスローされるはずです。コードが完全に表示されていないので、私は電話をかけることができません。

于 2012-12-04T06:11:56.187 に答える
0

For page Postback use following code on page load event

protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {

                 foreach (GridViewRow row in GridView1.Rows)
                    {
                        ((TextBox)row.FindControl("txtAccNo")).Text = Request.Form[((TextBox)row.FindControl("txtAccNo")).UniqueID];
                    }
          }
    }
于 2012-12-03T13:08:43.690 に答える