2013-06-20 7 views
1

ASP.NET 4.0. Я хочу разрешить пользователям просматривать/редактировать элементы по лицензии клиента. Лицензия имеет 1-M продукцию, и список продуктов будет расширяться с течением времени, поэтому я динамически создаю список всех продуктов (в Page_Load) с помощью флажка, чтобы указать, имеет ли лицензия этот продукт, например:Динамически созданные элементы управления теряют значения

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

я могу найти эти динамические элементы управления и получить доступ к их ценности на PostBack с помощью:

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

BTW, я настроил его так, чтобы функция BuildControls вызывалась в Page_Init, независимо от PostBack. Ошибка «ссылка на объект» сохраняется при попытке сохранить изменения пользователя. Если я вызову BuildControls из события SaveChanges, я пройду мимо него, но получаю сообщение об ошибке, заявив, что несколько элементов управления имеют одинаковый идентификатор, очевидно, поскольку BuildControls также находится в Page_Init. – SteveEx

+2

Эта идея словаря была серебряной пулей, которую я искал. Спасибо, @ matt-dot-net! – SteveEx