2015-03-28 4 views
0

Я надеялся, что кто-то может дать некоторые советы о том, что я делаю неправильно здесь. Я пытаюсь динамически добавить ряд элементов управления DropDownList, которые будут заполнены из базы данных. У меня есть много других DropDownLists, добавленных во время разработки, которые заполняются из базы данных и сохраняют состояние через обратную передачу.Поддерживает состояние динамически добавленного DropDownList C#

Я только испытываю проблемы с динамически добавленными элементами управления. Проблема заключается в том, что элемент управления DropDown заполняется из базы данных при первоначальном создании и возвращается после обратной передачи. (Я установил autopostback в true для элемента управления DropDownList, так что после удаления выбранного элемента происходит обратная передача.)

Я прочитал несколько сообщений и попытался использовать различные стратегии, и до сих пор ничего не работало.

Вот соответствующий код:

У меня есть заменитель, чтобы приложить управление.

<asp:PlaceHolder ID="DynamicControlsHolder" runat="server" /> 

Я использую переменную сеанса для хранения количества элементов управления (для моего теста я только добавление 1, но нужно будет добавить несколько)

public int NumberOfControls 
{ 
get { return (int)ViewState["NumControls"]; } 
set { ViewState["NumControls"] = value; } 
} 

Я называю два разных метода в зависимости от того, ему является обратной передачей или нет.

if (!IsPostBack) 
{ 
    this.NumberOfControls = 0; 
    addSomeControls(); 
} 
else 
{ 
    this.createControls(); 
} 

protected void addSomeControls() //done in original page_load so bind data 
{ 

    DropDownList dl = new DropDownList(); 
    //not using the following event handler yet, so I didn't post the code 
    dl.SelectedIndexChanged += new EventHandler(dlOnSelectedIndexChange); 

    using (I.DBEntities1 ctx = new I.IDBEntities1()) 
    { 

     dl.EnableViewState = true; 
     dl.AutoPostBack = true; 
     dl.ID = "ControlID_" + NumberOfControls.ToString(); 
     dl.DataSource = ctx.Lk_PersonPersonAssocType.OrderBy(c => c.Assoc_Type); 
     dl.DataValueField = "ID"; 
     dl.DataTextField = "Assoc_Type"; 
     dl.DataBind(); 
    } 

    DynamicControlsHolder.Controls.Add(dl); 
    this.NumberOfControls++; 
} 

protected void createControls() //postback 
{ 
     int count = this.NumberOfControls; 

     for (int i = 0; i < count; i++) 
     { 

      DropDownList dl = new DropDownList(); 

      dl.ID = "ControlID_" + NumberOfControls.ToString(); 

      DynamicControlsHolder.Controls.Add(dl); 

     } 
} 

Любая помощь была бы принята с благодарностью.

+0

Я создаю эти элементы управления динамически. Итак, я понимаю, что они больше не существуют после обратной передачи. –

+0

На этот вопрос отвечает количество раз [здесь один wanswer] (http://stackoverflow.com/questions/29073687/asp-net-postback-re-render-already-dynamically-added-controlls/29076146#29076146). Как поддерживать и получать vvaleus из динамически добавленных элементов управления. –

+0

andricadar, это DynamicControlsHolder.FindControl ("ControlID_" + NumberOfControls.ToString()) возвращает значение null для обратной передачи. –

ответ

0

У меня теперь есть работа, и я хочу опубликовать ответ, если это поможет другим. @dricdar, спасибо за вашу помощь. Аспекты вашей обратной связи помогают решить проблему.

Я переместил вызов createControls() в OnInit. я изменил NumberOfControls переменной сеанса:

public int NumberOfControls 
{ 
    get { return (int)Session["NumControls"]; } 
    set { Session["NumControls"] = value; } 
} 

В OnInit, onPostBack я называю createControls(). В Page_Load,! IsPostBack я устанавливаю NumberOfControls в ноль и вызываю addSomeControls();

Методы теперь выглядят следующим образом;

protected void addSomeControls() //done in original page_load so bind data 
    { 
     DropDownList dl = new DropDownList(); 
     dl.SelectedIndexChanged += new EventHandler(dlOnSelectedIndexChange); 

     dl.EnableViewState = true; 
     dl.AutoPostBack = true; 
     this.NumberOfControls++; 
     dl.ID = "ControlID_" + this.NumberOfControls.ToString(); 

     using (I.DBEntities1 ctx = new I.DBEntities1()) 
     { 
      dl.DataSource = ctx.Lk_PersonPersonAssocType.OrderBy(c => c.Assoc_Type); 
      dl.DataValueField = "ID"; 
      dl.DataTextField = "Assoc_Type"; 
      dl.DataBind(); 
     } 

     DynamicControlsHolder.Controls.Add(dl); 
     DynamicControlsHolder.EnableViewState = true; 

    } 


    protected void createControls() //postback, rely upon viewstate here 
    { 
     int count = this.NumberOfControls; 

     for (int i = 0; i < count; i++) 
     { 

      DropDownList dl = new DropDownList(); 
      dl.SelectedIndexChanged += new EventHandler(dlOnSelectedIndexChange); 
      dl.AutoPostBack = true; 

     using (I.DBEntities1 ctx = new I.DBEntities1()) 
     { 

      dl.DataSource = ctx.Lk_PersonPersonAssocType.OrderBy(c => c.Assoc_Type); 
      dl.DataValueField = "ID"; 
      dl.DataTextField = "Assoc_Type"; 
      dl.DataBind(); 

     } 

     dl.ID = "ControlID_" + NumberOfControls.ToString(); 

     DynamicControlsHolder.Controls.Add(dl); 

     } 
    } 
Смежные вопросы