2013-06-20 143 views
1

ASP.NET 4.0。我想讓用戶查看/編輯客戶許可證上的項目。有許可證1-M的產品,產品的名單將擴大隨着時間的推移,所以我動態創建的所有產品(在Page_Load中)與複選框列表說的許可是否有產品,像這樣:動態創建的控件丟失值

CheckBox cbxProduct = new CheckBox(); 
cbxProduct.ID = "cbxProduct" + product.ID.ToString(); 

我能找到這些動態控制和使用訪問回發他們的價值觀:

CheckBox cbxProd = (CheckBox)pnlLicenseDetails.FindControl("cbxProduct" + productID.ToString()); 

但只有當他們剛剛在Page_Load中重新創建(或Page_Init,似乎並不重要)。問題是我希望用戶能夠取消選中一個框以從許可證中刪除產品,然後保存結果。但爲了找到複選框並確定其值,我必須重新創建控件,這當然會刪除用戶輸入的任何值。

如果我嘗試引用的複選框,而無需重新創建它們,我當然得到一個「對象未設置...」錯誤。所以我需要一些方法來捕捉用戶在輸入之前輸入的值。

對此提出建議?

回答

0

您必須在Page_Init中創建動態控件。您必須以相同的方式爲所有請求創建它們。這意味着,無論IsPostBack是否加載,每次加載頁面時都運行相同的代碼來創建控件並將其添加到控件集合中。

此外,我建議您將動態控件的實例保存到私有成員變量,因此您不必撥打FindControl,因爲這可能很昂貴。

由於它使用字典來存儲複選框看起來你有一個產品列表的地方,這裏有一個例子:

public partial class _Default : Page 
{ 
    private Dictionary<Int32,CheckBox> _myDynamicCheckBoxes; 

    protected override void OnInit(EventArgs e) 
    { 
     _myDynamicCheckBoxes = new Dictionary<Int32,CheckBox>(); 

     foreach (var product in _listOfProducts) 
     { 
      var chkBox = new CheckBox {ID = "CheckBox" + product.ID.ToString()}; 
      _myDynamicCheckBoxes.Add(product.ID,chkBox); 
      //add the checkbox to a Controls collection 
     } 
    } 
} 

然後別的地方在你的代碼,當你有一個產品,你想找到關聯的複選框即可使用:var aCheckBox = _myDynamicCheckBoxes[product.ID];

+0

謝謝,@ matt-dot-net。你能解釋FindControl的替代方案嗎?我不確定私人成員變量是什麼意思。 – SteveEx

+0

順便說一下,我設置了它,以便在Page_Init中調用BuildControls函數,而不管PostBack。嘗試保存用戶更改時,「對象引用」錯誤仍然存​​在。如果我從SaveChanges事件中調用BuildControls,我會通過它,但是得到一個錯誤,說多個控件具有相同的ID,顯然,因爲BuildControls也在Page_Init中。 – SteveEx

+2

字典的想法是我尋找的銀彈。謝謝,@ matt-dot-net! – SteveEx