2013-12-18 32 views
0

但是,我有下面的代碼工作正常,當我點擊刪除按鈕事件觸發但更改不顯示回發。這顯然與PostBack managemment有關。有沒有人有什麼建議?OnClick Events的回傳問題

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

     } 

     void Edit_Click(object sender, ImageClickEventArgs e) 
     { 
      ImageButton editbut = sender as ImageButton; 
      string cName = editbut.ID; 
      string rID = cName.Remove(0, 5); 

      Response.Write(Request.Form["entity_" + rID]); 
      Response.Write(Request.Form["dollar_" + rID]); 

     } 

     void Delete_Click(object sender, ImageClickEventArgs e) 
     { 
      var delbut = (ImageButton)sender; 
      string cName = delbut.ID; 
      string rID = cName.Remove(0, 7); 
      string MyParams = "@RowID=" + rID; 

      iservices.DataAccessWebService WS = new iservices.DataAccessWebService(); 

      WS.ExecuteDatasetStoredProcedure(ConfigurationManager.AppSettings["SecurityDataAccess"], "iweb_sp_custom_coi_Question_Delete", MyParams.ToString()); 
      LoadControls(); 
      Response.Write("dome"); 
     } 


     protected void LoadControls() 
     { 

      //Construct paramters from Querystring 
      StringBuilder MyParams = new StringBuilder(); 
      MyParams.Append("@Term=2013,@ProjectCode=a12345,@ID=123,@CategoryCode=CONSULTANCIES"); 

      //Count Answered questions 
      iservices.DataAccessWebService WS = new iservices.DataAccessWebService(); 
      DataSet MyAnswers = WS.ExecuteDatasetStoredProcedure(ConfigurationManager.AppSettings["SecurityDataAccess"], "iweb_sp_custom_coi_SelectCurrentQuestion", MyParams.ToString()); 



      foreach (DataTable dt in MyAnswers.Tables) 
      { 
       int rc = 0; 

       foreach (DataRow dr in dt.Rows) 
       { 

        //Generate unique controls from DS 
        TextBox tbx = new TextBox(); 
        tbx.ID = "entity_" + dr["rowID"].ToString(); 
        tbx.Text = dr["EntityName"].ToString(); 
        tbx.Width = 200; 

        DropDownList DollarRange = new DropDownList(); 
        DollarRange.Items.Add("Select Dollar Amount"); 
        DollarRange.Items.Add("Up to $1,000"); 
        DollarRange.Items.Add("$1,001 - 5,000"); 
        DollarRange.Items.Add("$5,001 - $10,000"); 
        DollarRange.Items.Add("$10,001 - $50,000"); 
        DollarRange.Items.Add("$50,001 - or more"); 
        DollarRange.ID = "dollar_" + dr["rowID"].ToString(); 
        DollarRange.SelectedValue = dr["DollarRange"].ToString(); 

        ImageButton Delete = new ImageButton(); 
        Delete.ImageUrl = "delete.png"; 
        Delete.ID = "delete_" + dr["rowID"].ToString(); 
        Delete.Click += Delete_Click; 

        ImageButton Edit = new ImageButton(); 
        Edit.ImageUrl = "edit.png"; 
        Edit.ID = "edit_" + dr["rowID"].ToString(); 
        Edit.Click += Edit_Click; 

        //Append controls to placeholder 
        DataZone.Controls.Add(new LiteralControl((rc % 2 == 0) ? "<tr><td bgcolor='#f1f0e7'>" : "<tr><td>")); 
        DataZone.Controls.Add(tbx); 
        DataZone.Controls.Add(new LiteralControl((rc % 2 == 0) ? "</td><td bgcolor='#f1f0e7'>" : "</td><td>")); 
        DataZone.Controls.Add(DollarRange); 
        DataZone.Controls.Add(new LiteralControl((rc % 2 == 0) ? "</td><td bgcolor='#f1f0e7'>" : "</td><td>")); 
        DataZone.Controls.Add(Delete); 
        DataZone.Controls.Add(Edit); 
        DataZone.Controls.Add(new LiteralControl("</td></tr>")); 
        rc++; 
       } 



      } 

     } 
    } 
} 
+0

是的,沒有數據返回。我檢查了數據庫,信息仍然存在。如果我再次刷新頁面並刷新,我的數據都會重新出現。 –

+0

當您在UI上單擊時,是否觸發Delete_Click方法? –

+0

不,我把代碼移到了page_load部分,它觸發並刪除了記錄,但我的數據在處理修改後的數據之前顯示,因此我看到了舊結果。 –

回答

0

代碼的問題是,如果它不是PostBack,則不執行LoadControls。當你動態地添加新的控件時,它會在頁面內註冊,所以當回調控件時會被調用 - 頁面會知道它應該調用什麼方法。

在你的情況下,當PostBack發生時,你不會調用LoadControls,所以Page不知道它應該調用什麼方法,因爲在頁面搜索控件處理當前回發數據時沒有控制。

如果你每次都會做LoadControls而不檢查PageLoad中的IsPostBack,那麼Delete_Click方法將會被調用。但是可能會對數據做兩次請求 - 一次是在PageLoad中進行控件填充,另一次是在Delete_Click方法中刪除和更新新數據。

沒有您的另一個代碼的時刻 - 你正在將控件添加到數據區,我想是ASP:佔位符,但你並不清楚,所以控制可以複製的第二LoadControls調用。像往常一樣,在更新數據之前需要清除PlaceHolder。

+0

在刪除按鈕的Click事件中,我添加了 DataZone.Controls.Clear(); LoadControls(); 它似乎在工作。我對佔位符相當陌生,所以我沒有考慮清除它,但它是有道理的。我也有LoadControls()每次註冊。它似乎現在正在工作。你看到我的整體架構有什麼問題嗎?任何有用的提示將不勝感激! –

+0

總的來說,它似乎沒問題。您唯一可以嘗試使用Repeater \ GridView控件的方式,因爲它們用於這類事情。所以你不需要動態創建控件。您只需指定每行的佈局,然後加載DataTable,將其設置爲repeater.DataSource屬性,然後調用repeater.DataBind,它將根據DataTable項目和指定的佈局創建所有行。 –