2009-10-21 3 views
1

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

Я понимаю, что динамические элементы управления необходимо создавать в OnInit или в CreateChildControls, чтобы ViewState для этих динамических элементов управления корректно восстанавливался во время выполнения.

Проблема заключается в том, что я не могу получить SelectedValue выпадающего списка в OnInit или CreateChildControls, поскольку ViewState еще не восстановлен для раскрывающегося списка.

Есть ли способ, чтобы получить текущий выбор, так что я могу создавать динамические элементы управления на основе текущего выбора пользователя и добавить их страницу правильно

EDIT: Разметка выглядит следующим образом:

<form id="form1" runat="server"> 
<div> 
    <asp:DropDownList ID="ddl" runat="server" AutoPostBack="true" AppendDataBoundItems="true"> 
     <asp:ListItem Text="(Select Color)" Value="" /> 
     <asp:ListItem Text="Red" Value="Red" /> 
     <asp:ListItem Text="Green" Value="Green" /> 
     <asp:ListItem Text="Blue" Value="Blue" /> 
    </asp:DropDownList> 
    <asp:PlaceHolder ID="plHolder" runat="server" /> 
</div> 
</form> 

и вот код позади:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     TextBox tb = new TextBox(); 
     if (ddl.Text != "") 
     { 
      tb.Text = ddl.Text; 
      if (Session["id"] != null) 
      { 
       string id = Session["id"].ToString(); 
       tb.ID = id; 
      } 
      else 
      { 
       Session["id"] = tb.ID = Guid.NewGuid().ToString().Replace("-", ""); 
      } 
      plHolder.Controls.Add(tb); 
     } 

    } 
} 

на линии "tb.Text = ddl.Text;" Я надеюсь получить текущий выбор и на основе этого установить значение свойства text для динамического элемента управления. Но текущий выбор еще не установлен, так как он включен в OnInit.

+0

вам нужно разместить код, чтобы проверить, где проблема, в соответствии с вашим заявлением кажется ОК. –

+0

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

ответ

2

Если элементы управления действительно должны быть созданы в OnInit или CreateChildControls, то одна вещь, которую вы можете сделать, это получить значение вашего статического элемента управления из коллекции Request.Form [] во время OnInit.

Так вместо того, чтобы делать:

string selected = myDropDown.SelectedValue; 

вы

string selected = Request.Form[myDropDownUniqueID]; 

... где myDropDownID это 'уникальный идентификатор' присвоен myDropDown. Обратите внимание, что обычно это будет то же самое, что и идентификатор, назначенный элементу управления, если он не находится внутри контейнера управления.

Это эффективно вытаскивает значение прямо из данных формы HTML, отправляемых на сервер, вместо того, чтобы ждать, пока ASP.NET распакует его в свойства элемента управления.

+0

@codeulike: Request.Form [myDropDownUniqueID], похоже, отлично работает, когда выпадающий идентификатор определен отдельно, а не в каком-либо контейнере. Любые предложения о том, как получить уникальный идентификатор, когда выпадающий элемент является частью EditItemTemplate в Gridview? Мне нужно перейти к uniqueId выпадающего списка для текущей строки, редактируемой. –

+0

Я полагаю, что во время OnInit элемент управления GridView не будет готов сообщить вам, что он содержит.Лучше всего провести цикл через элемент управления GridView при предыдущей обратной передаче (например, вскоре после того, как он будет привязан к базе данных), извлеките UniqieID каждого элемента управления и сохраните их в Session [] для последующего использования. – codeulike

+0

Или ... Уникальные идентификаторы, которые назначаются элементам управления в GridViews, довольно предсказуемы (посмотрите на источник страницы, которая получает визуализацию). Возможно, вы сможете это использовать. Кроме того, вы можете пройти через коллекцию Forms [], ища ключи, соответствующие шаблону. – codeulike

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