ASP.NET переключает контроль видимости из кода позади - PullRequest
3 голосов
/ 29 октября 2011

У меня есть две проблемы, в которых я не уверен:

У меня есть два элемента управления DropDownList (изначально установленный как невидимый) и элемент управления RadioButtonList с поведением автоответчика, установленным в значение true.

Всякий раз, когда происходит обратная передача, я хочу прочитать свойство SelectedValue из элемента управления RadioButtonList - и, в зависимости от этого, сделать видимым один из DropDownLists.

Вот моя проблема:

1) Я не могу напрямую ссылаться на элемент управления RadioButtonList по его идентификатору. Кажется, что файл designer.cs не генерирует элементы управления RadioButtonList или DropDownList. Даже если я вручную добавлю элементы управления в файл designer.cs, они будут потеряны при восстановлении. Это ожидаемое поведение?

2) Я пытался использовать свойство Page.FindControl в методе Page_Load ().

if(Page.PostBack==true)
{
    RadioButtonList rbl = (RadioButtonList)Page.FindControl("RadioButtonList1");
    if(rbl.SelectedValue=="optionA")
    {
         DropDownList ddA = (DropDownList)Page.FindControl("DropDownListA");
         ddA.Visible = true;   
    }
    else
    {
         DropDownList ddB = (DropDownList)Page.FindControl("DropDownListB");
         ddB.Visible=true;
    }
}

Но я получаю исключение NullReferenceException при условии if.

Я совершенно не на том пути? Кто-нибудь подскажет мне, как лучше всего достичь того, чего я хочу?

Кроме того, что я могу сделать, чтобы файл designer.cs загружал элементы управления?


РЕДАКТИРОВАТЬ: / facepalm

Я понял это сам. Я забыл, чем использую элемент управления внутри таблицы.

Как только я переместил элемент управления за пределы таблицы, я мог напрямую обратиться к идентификатору.

Недостаток сна и кофе виноват. Мои извенения. Спасибо за помощь!

Ответы [ 3 ]

2 голосов
/ 29 октября 2011

Page.FindControl не является рекурсивным, то есть он будет возвращать ноль, если элементы управления dropdownlist1 находятся в каком-либо другом элементе управления. проверьте эту ссылку для подробностей и посмотрите, сможете ли вы найти выпадающий список правильно.

http://www.mha.dk/post/Recursive-PageFindControl.aspx

0 голосов
/ 29 октября 2011

Если вы не можете сослаться на элемент управления по его идентификатору, и FindControl не работает, возможно, в файле aspx ваши элементы управления пропускают тег runat="server".

Это так?

0 голосов
/ 29 октября 2011

Вы присваиваете значение rb1.SelectedValue, и вы должны проверить, был ли найден элемент управления.

if(rb1.SelectedValue="optionA") 

должно быть

if(rb1.SelectedValue != null)
{ 
   if(rb1.SelectedValue == "optionA")
   {
       DropDownList ddA = (DropDownList)Page.FindControl("DropDownListA"); 

       if (ddA != null)
                 ddA.Visible = true;  
   }
} 
...