2013-10-03 84 views
0

我有一个网页,动态创建按钮点击gridviews,这工作正常。随着它创建一个网格,在网格顶部有一个链接按钮来删除它。现在,我试图完成的是,当我删除其中一个网格时,它将从网页中删除网格并重新同步数字。含义,可以说,我有以下几点:删除动态gridview

Grid1 
Grid2 
Grid3 
Grid4 

如果我决定要删除GRID3,实际发生的事情是这样的:

Grid1 
Grid2 
Grid4 

然后,如果我点击页面上的东西为它重新加载或东西,那么它会正确地重新同步的数字:

Grid1 
Grid2 
Grid3 

我不知道为什么它这样做,为什么它不会做这种方式摆在首位。有人可以帮助我吗?

public partial class Default2 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     string ctrlname = this.Page.Request.Params.Get("__EVENTTARGET"); 

     if (Session["Tables"] == null) 
     { 

      Session.Add("Tables", 1); 

      DataTable dt = GetTable(); 

      Session.Add(Session["Tables"].ToString(), dt); 
      GridView gv = new GridView(); 
      gv.ID = "Grid-" + Session["Tables"].ToString(); 
      gv.DataSource = dt; 
      gv.DataBind(); 
      LinkButton lb = new LinkButton(); 
      lb.ID = "Delete-Grid-" + Session["Tables"].ToString(); 
      lb.Text = "Delete Grid " + Session["Tables"].ToString(); 
      lb.Click += new EventHandler(DeleteGrid); 
      PlaceHolder1.Controls.Add(lb); 
      PlaceHolder1.Controls.Add(gv); 

     } 
     if (IsPostBack) 
     { 
      PlaceHolder1.Controls.Clear(); 
      int next = (int)Session["Tables"]; 

      for (int i = 1; i <= (int)Session["Tables"]; i++) 
      { 
       GridView gv = new GridView(); 
       gv.ID = "Grid-" + i.ToString(); 
       gv.DataSource = (DataTable)Session[i]; 
       gv.DataBind(); 
       LinkButton lb = new LinkButton(); 
       lb.ID = "Delete-Grid-" + i.ToString(); 
       lb.Text = "Delete Grid " + i.ToString(); 
       lb.Click += new EventHandler(DeleteGrid); 
       PlaceHolder1.Controls.Add(lb); 
       PlaceHolder1.Controls.Add(gv); 
      } 
      if (ctrlname == "Button1") 
      { 
       next = next + 1; 
       Session["Tables"] = next; 
       DataTable dt = GetTable(); 
       Session.Add(Session["Tables"].ToString(), dt); 
       GridView gv = new GridView(); 
       gv.ID = "Grid-" + next.ToString(); 
       gv.DataSource = (DataTable)Session[next]; 
       gv.DataBind(); 
       LinkButton lb = new LinkButton(); 
       lb.ID = "Delete-Grid-" + next.ToString(); 
       lb.Text = "Delete Grid " + next.ToString(); 
       lb.Click += new EventHandler(DeleteGrid); 
       PlaceHolder1.Controls.Add(lb); 
       PlaceHolder1.Controls.Add(gv); 
      } 

     } 
    } 



    protected void Button1_Click(object sender, EventArgs e) 
    { 

    } 




    protected void DeleteGrid(object sender, EventArgs e) 
    { 
     LinkButton gridLink = (LinkButton)sender; 
     String gridNum = gridLink.ID.ToString().Split('-').Last(); 

     GridView grid = (GridView)this.Page.FindControl("Grid-" + gridNum); 
     LinkButton lbd = (LinkButton)this.Page.FindControl("Delete-Grid-" + gridNum); 


     PlaceHolder1.Controls.Remove(grid); 
     PlaceHolder1.Controls.Remove(lbd); 

     int next = (int)Session["Tables"]; 
     next = next - 1; 
     Session.Add("Tables", next); 
     Session.Remove(gridNum); 
    } 






    public DataTable GetTable() 
    { 
     // 
     // Here we create a DataTable with a few columns. 
     // 
     // Create Datatable to store all colums 
     DataTable dt = new DataTable(); 
     DataRow dr = null; 
     dt.Columns.Add(new DataColumn("RowNumber", typeof(string))); 
     dt.Columns.Add(new DataColumn("Size", typeof(string))); 
     dt.Columns.Add(new DataColumn("Description", typeof(string))); 
     dt.Columns.Add(new DataColumn("Quantity", typeof(string))); 
     dt.Columns.Add(new DataColumn("Unit", typeof(string))); 
     dt.Columns.Add(new DataColumn("Duration", typeof(string))); 
     dt.Columns.Add(new DataColumn("DurationType", typeof(string))); 
     dt.Columns.Add(new DataColumn("Amount", typeof(string))); 
     dr = dt.NewRow(); 
     dr["RowNumber"] = 1; 
     dr["Size"] = string.Empty; 
     dr["Description"] = string.Empty; 
     dr["Quantity"] = string.Empty; 
     dr["Unit"] = string.Empty; 
     dr["Duration"] = string.Empty; 
     dr["DurationType"] = string.Empty; 
     dr["Amount"] = string.Empty; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["RowNumber"] = 2; 
     dr["Size"] = string.Empty; 
     dr["Description"] = string.Empty; 
     dr["Quantity"] = string.Empty; 
     dr["Unit"] = string.Empty; 
     dr["Duration"] = string.Empty; 
     dr["DurationType"] = string.Empty; 
     dr["Amount"] = string.Empty; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["RowNumber"] = 3; 
     dr["Size"] = string.Empty; 
     dr["Description"] = string.Empty; 
     dr["Quantity"] = string.Empty; 
     dr["Unit"] = string.Empty; 
     dr["Duration"] = string.Empty; 
     dr["DurationType"] = string.Empty; 
     dr["Amount"] = string.Empty; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["RowNumber"] = 4; 
     dr["Size"] = string.Empty; 
     dr["Description"] = string.Empty; 
     dr["Quantity"] = string.Empty; 
     dr["Unit"] = string.Empty; 
     dr["Duration"] = string.Empty; 
     dr["DurationType"] = string.Empty; 
     dr["Amount"] = string.Empty; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["RowNumber"] = 5; 
     dr["Size"] = string.Empty; 
     dr["Description"] = string.Empty; 
     dr["Quantity"] = string.Empty; 
     dr["Unit"] = string.Empty; 
     dr["Duration"] = string.Empty; 
     dr["DurationType"] = string.Empty; 
     dr["Amount"] = string.Empty; 
     dt.Rows.Add(dr); 
     return dt; 
    } 


} 

回答

0

您需要先了解一个asp.net页面的生命周期。 请参考this文章...

在你的情况下,删除甚至是在页面加载事件后触发。因此,在行被删除之前发生同步。 可能是你需要把另一种方法的同步代码,并在删除后调用它...

+0

你有我如何需要这样做的例子吗? –

+0

嗨布拉德,不幸的是,但不难测试,只需创建一个方法,从'if post-back'块中复制代码并在删除后调用该方法。 – Afshin

+0

是的,但问题是,没有重新同步数字的方法,它会自动执行,但它不会在我点击删除后立即执行 –