2013-09-26 42 views
1

我在頁面中有一個asp佔位符,並且我在其中動態插入「行」,其中每行都是用戶控件。在佔位符內部使用用戶控件作爲行

如果請求是GET請求,我從數據庫加載數據並根據需要填充儘可能多的用戶控件。我還將控件實例添加到會話內容中。

如果請求是POST請求,我首先通過查看Page_Load()內部的會話內容來重新創建控件。之後,每個按鈕的處理程序都可以執行任何額外的工作,比如向佔位符,會話和數據庫添加一行(從佔位符,會話和數據庫中刪除一行)或更新現有的行。

我在這裏面臨幾個問題:

  1. 當刪除行,有時是錯誤的數據被刪除後顯示在屏幕上,即使右行已被刪除。這很危險,因爲進一步刪除我們不知道哪些行會受到影響。
  2. 當添加一個新行,有時現有行的一個將在它的錯誤的數據(從另一個現有的行具體數據)

我該如何解決這些問題?我很難診斷問題。這些常見問題?我是否完全錯了?有什麼更好的方法來完成這個?

回答

1

我以前有過這樣的問題。我固定的他們是:

  • 當你實例化你的用戶控件,你把它放進它需要有相同的ID回發 (即當你第一次創建)之前所做的 佔位符之前。我做了一些像"usr_" + <db record id>。這確保了它的相同ID,不管它以何種順序被加載,哪些記錄被刪除等。這可能是最重要的事情,因爲如果你不分配它的ID的.NET將 分配給你 - 並且它們按照它們在控件集合中顯示的順序進行分配,這意味着您可能在錯誤的用戶控件(您在 問題中描述的)中有錯誤信息 。
  • 不使用會話來存儲有關頁面的信息。一旦ID 問題得到解決,如果在同一頁面打開 兩個選項卡,則人們仍然遇到問題。沿着這些線路

東西:

using (SqlConnection c = new SqlConnection(DB_STRING)) 
{ 
    c.Open(); 
    String sql = @" 
     SELECT * 
     FROM yourTable 
     ORDER BY ID;"; 
    using (SqlCommand cmd = new SqlCommand(sql, c)) 
    { 
     using (SqlDataReader d = cmd.ExecuteReader()) 
     { 
      while (d.Read()) 
      { 
       UserControl uc = (UserControl)new UserControl().LoadControl("~/path/to-your-control/YourControl.ascx"); 
       uc.ID = "usr_" + d["ID"]; 
       plcHolderRows.Controls.Add(uc); 
      } 
     } 
    } 
}