开发者

Getting exception while deleting rows from GridView

开发者 https://www.devze.com 2023-03-08 01:57 出处:网络
I want to delete selected rows from a GridView. For this I have written the below code, but I am getting an exception:

I want to delete selected rows from a GridView. For this I have written the below code, but I am getting an exception:

An unhandled exception of type 'System.StackOverflowException' occurred in System.Web.dll

Here is my aspx.page:

    <asp:gridview ID="Gridview1" runat="server" ShowFooter="true" 
            onrowcommand="Gridview1_RowCommand"  AutoGenerateColumns="false" 
            CellSpacing="0" CellPadding="0" Font-Bold="false" 
            onrowdeleting="Gridview1_RowDeleting">
        <Columns>
      <asp:TemplateField HeaderText="Select" ControlStyle-Width="50px" HeaderStyle-Font-Bold="false" ControlStyle-Font-Bold="false">
     <ItemTemplate>         
         <asp:CheckBox ID="chkSelect" runat="server" Width="80px"/>
     </ItemTemplate>
   </asp:TemplateField>
        <asp:TemplateField HeaderText="Header 1" HeaderStyle-Font-Bold="false" ControlStyle-Font-Bold="false">
            <ItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Width="70px"></asp:TextBox>
            </ItemTemplate>         开发者_如何学编程   
            <FooterTemplate>
                <asp:Label ID="lblTotal" runat="server" Text="Total" Font-Bold="true"></asp:Label>
            </FooterTemplate>            
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Header 2"  HeaderStyle-Font-Bold="false" ControlStyle-Font-Bold="false">
            <ItemTemplate>
                <asp:TextBox ID="TextBox2" Width="70px" runat="server" class="calculate" onchange="calculate()"></asp:TextBox>
            </ItemTemplate>            
            <FooterTemplate>
                <asp:TextBox ID="total" runat="server" Width="70px"></asp:TextBox>
            </FooterTemplate>  

        </asp:TemplateField>
        <asp:TemplateField HeaderText="Header 3" HeaderStyle-Font-Bold="false" ControlStyle-Font-Bold="false">
            <ItemTemplate>
                 <asp:TextBox ID="TextBox3" Width="70px" runat="server" ></asp:TextBox>
            </ItemTemplate>
            <FooterStyle HorizontalAlign="Right" />
            <FooterTemplate>
             <asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" CommandName="AddNewRow" />
            <asp:Button  ID="btnDelete" runat="server" CommandName="DeleteRow" Text="Delete"         
            OnClientClick="return DeleteConfirmation();"/> 
            </FooterTemplate>
        </asp:TemplateField>
        </Columns>
</asp:gridview>   

Here is the code behind the aspx page:

     public partial class _Default : System.Web.UI.Page
    {
     protected void Page_Load(object sender, EventArgs e)
     {
        if (!Page.IsPostBack)
        {
            SetInitialRow();
        }

    }

    private void SetInitialRow()
    {
        DataTable dt = new DataTable();
        DataRow dr = null;
        dt.Columns.Add(new DataColumn("RowNumber", typeof(string)));
        dt.Columns.Add(new DataColumn("Column1", typeof(string)));
        dt.Columns.Add(new DataColumn("Column2", typeof(string)));
        dt.Columns.Add(new DataColumn("Column3", typeof(string)));
        dr = dt.NewRow();
        dr["RowNumber"] = 1;
        dr["Column1"] = string.Empty;
        dr["Column2"] = string.Empty;
        dr["Column3"] = string.Empty;
        dt.Rows.Add(dr);
        //dr = dt.NewRow();

        //Store the DataTable in ViewState
        ViewState["CurrentTable"] = dt;

        Gridview1.DataSource = dt;
        Gridview1.DataBind();
    }

    private void AddNewRowToGrid()
    {
        int rowIndex = 0;

        if (ViewState["CurrentTable"] != null)
        {
            DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
            DataRow drCurrentRow = null;
            if (dtCurrentTable.Rows.Count > 0)
            {
                for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                {
                    //extract the TextBox values
                    TextBox box1 =  (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
                    TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2");
                    TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3");

                    drCurrentRow = dtCurrentTable.NewRow();
                    drCurrentRow["RowNumber"] = i + 1;
                    drCurrentRow["Column1"] = box1.Text;
                    drCurrentRow["Column2"] = box2.Text;
                    drCurrentRow["Column3"] = box3.Text;

                    rowIndex++;
                }
                //add new row to DataTable
                dtCurrentTable.Rows.Add(drCurrentRow);
                //Store the current data to ViewState
                ViewState["CurrentTable"] = dtCurrentTable;

                //Rebind the Grid with the current data
                Gridview1.DataSource = dtCurrentTable;
                Gridview1.DataBind();
            }
        }
        else
        {
            Response.Write("ViewState is null");
        }
        //Set Previous Data on Postbacks
        SetPreviousData();
    }

    private void SetPreviousData()
    {
        int rowIndex = 0;
        if (ViewState["CurrentTable"] != null)
        {
            DataTable dt = (DataTable)ViewState["CurrentTable"];
            if (dt.Rows.Count > 0)
            {
                for (int i = 1; i < dt.Rows.Count; i++)
                {
                    TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
                    TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2");
                    TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3");

                    box1.Text = dt.Rows[i]["Column1"].ToString();
                    box2.Text = dt.Rows[i]["Column2"].ToString();
                    box3.Text = dt.Rows[i]["Column3"].ToString();

                    rowIndex++;

                }
            }
        }
    }
    protected void Gridview1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "AddNewRow")
        {
            AddNewRowToGrid();          
        }
        if (e.CommandName == "DeleteRow")
        {
      for (int i = 0; i < Gridview1.Rows.Count; i++)
            {
                CheckBox chkDelete = (CheckBox)
                   Gridview1.Rows[i].Cells[0].FindControl("chkSelect");
                if (chkDelete != null)
                {
                    if (chkDelete.Checked)
                    {
                        //strID = GridView1.Rows[i].Cells[1].Text;
                        //idCollection.Add(strID);
                        Gridview1.DeleteRow(i);
                    }
                }
            }
        }
        Gridview1.DataBind();
    }
       protected void Gridview1_RowDeleting(object sender, GridViewDeleteEventArgs e)
       {
           for (int i = 0; i < Gridview1.Rows.Count; i++)
            {
                CheckBox chkDelete = (CheckBox)
                   Gridview1.Rows[i].Cells[0].FindControl("chkSelect");
                if (chkDelete != null)
                {
                    if (chkDelete.Checked)
                    {
                        //strID = GridView1.Rows[i].Cells[1].Text;
                        //idCollection.Add(strID);
                        Gridview1.DeleteRow(i);
                    }
                }
            }
           Gridview1.DataBind();       
    }
}


I don't think you need to implement the RowDeleting event in your code. The RowDeleting event is just there to inform the program that a row is gonna get deleted.

In your example the RowDeleting event is calling the DeleteRow method, wich will cause RowDeleting event to be triggered and then the circle will just happend again. This circle will eventually end when the computer sees no other option then to cause a StackOverflowException and end your program.

0

精彩评论

暂无评论...
验证码 换一张
取 消