2013-09-06 4 views
1

На основании определенного условия я создал несколько флажков, dropdownlists и текстовых полей динамически в Page_Init(). На той же странице у меня есть кнопка «Отправить», которая создается во время время разработки (на странице aspx). Ниже приведена часть кода. Видимость текстового поля контролируется флажком.несколько проблем для этих элементов управления, динамически созданных в файле page_init

Теперь у меня есть две проблемы, которые необходимо решить: (1) ddl.selectedIndex всегда инициализируется 0 не -1. Но в обработчике событий Sumbit_Click() ddl.selectedIndex равен 0, даже я не выбрал ни одного элемента. (2) Также флажок установлен, во время обратной передачи текстовое поле не отображается. Есть ли способ исправить это?

DropDownList ddl = new DropDownList(); 
ddl.ID = "ddl" + id; 
ddl.DataSource = subCallReasonEntityList; 
ddl.DataTextField = "myText"; 
ddl.DataValueField = "id";       
ddl.DataBind(); 
ddl.SelectedIndex = -1; 
cell.Controls.Add(ddl); 

CheckBox cb = new CheckBox(); 
cb.ID = "cb" + id; 
cb.ClientIDMode = ClientIDMode.Static; 
cell.Controls.Add(cb); 
cell.Controls.Add(new LiteralControl("<br />")); 

TextBox tb = new TextBox(); 
tb.ID = "txt" + id; 
tb.ClientIDMode = ClientIDMode.Static; 
tb.Attributes.Add("style", "display:none"); 
cb.Attributes.Add("onclick", "return cbOtherClicked('" + cb.ClientID + "', '" + tb.ClientID + "')"); 
cell.Controls.Add(tb); 

function cbOtherClicked(control1, control2) { 
var cbOther = document.getElementById(control1); 
var txtOther = document.getElementById(control2); 

if (cbOther.checked) { 
    txtOther.style.display = "block"; 
} 
else { 
    txtOther.style.display = "none"; 
} 
} 
+1

Это укажет вам в правильном направлении: http://stackoverflow.com/questions/4216329/asp-net-dynamically-created-controls-and-postback –

ответ

2

Проблема в том, что ваши динамические элементы управления не поддерживают ViewState.

KEY: Изменить элемент управления после добавления его в форму/страницу и т. Д. Если вы измените свойства до их добавления в форму, добавленные значения не будут отображаться в viewState и будут потеряны при обратной передаче. По крайней мере, сделайте это как стандарт.

Таким образом, сделать это следующим образом:

DropDownList ddl = new DropDownList(); 
// add first this control 
cell.Controls.Add(ddl); 
// now set the values 
ddl.ID = "ddl" + id; 
ddl.DataSource = subCallReasonEntityList; 
ddl.DataTextField = "myText"; 
ddl.DataValueField = "id";       
ddl.DataBind(); 
ddl.SelectedIndex = -1; 

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

Когда мы добавляем какой-либо элемент управления динамически, он воспроизводит «догоняющую» с жизненным циклом страницы после их добавления. После того, как элемент управления добавлен в коллекцию «Controls», все события, которые он пропустил увольняют

Это приводит к очень важному выводу:. вы можете добавить динамические элементы управления в любое время в течение жизненного цикла страницы до тех пор, Событие «PreRender». Даже когда вы добавляете динамический элемент управления в событие «PreRender», как только элемент управления добавляется в коллекцию «Элементы управления», «Init», «LoadViewState», «LoadPostbackdata», «Load» и «SaveViewstate» запускаются для этот контроль.

+0

Я внесла корректировку в свой код, но значение SelectedIndex все равно 0. – GLP

+0

Пожалуйста, убедитесь, что вы добавляете элементы в DropDownlist только в том случае, если Count равен нулю. Также ссылайтесь на эту ссылку: http://codebetter.com/jefferypalerm/200/2004/11/25/key-to-ensuring-dynamic -asp-net-controls-save-viewstate-level-300/ –

+0

Также покажите свой обработчик отправки –