Что может заставить FindControl () выдавать исключение NullReferenceException? - PullRequest
2 голосов
/ 28 января 2011

У меня есть пользовательский элемент управления, который я создаю (ASP.NET 3.5, использующий C #).

Этот элемент управления в значительной степени основан на другом, аналогичном элементе управления (к сожалению, наследование «вырезать и вставить», но не так-то простоспособ абстрагировать это).Строки, которые вызывают у меня проблемы, напрямую копируются с другого элемента управления, как и большая часть дисплея.

Соответствующие строки кода следующие:

Panel pnlForm = (Panel)e.Item.FindControl("pnlForm");
Literal ltrAvailableCount = (Literal)e.Item.FindControl("ltrAvailableCount");

DropDownList drpLanguage = (DropDownList)pnlForm.FindControl("drpLanguage");
DropDownList drpShipTo = (DropDownList)pnlForm.FindControl("drpShipTo");
HiddenField hdnAvailableProductId = (HiddenField)pnlForm.FindControl("hdnAvailableProductId");

DropDownList drpQuantity = (DropDownList)pnlForm.FindControl("drpQuantity");
HiddenField hdnSelectedStyle = (HiddenField)e.Item.FindControl("hdnSelectedStyle");
Label lblStyleName = (Label)e.Item.FindControl("lblSelectedStyle");

pnlForm в вышеприведенном коде найдено правильно, как и ltrAvailableCount.

Если я пропущу до drpQuantity, он и следующие строки работают нормально.Однако, когда я запускаю строки для drpLanguage, drpShipTo или hdnAvailableProductId FindControl, выдает NullReferenceException.

, я не имею в виду, что он возвращает «ноль», и я пытаюсь получить доступ кСвойство возвращаемого объекта, метод FindControl выдает исключение.Согласно библиотеке MSDN, это невозможно - FindControl ничего не перечисляет как потенциальную ошибку, а просто говорит, что если не удается найти элемент управления, он возвращает ноль.

Чтоможет вызвать FindControl к NullReferenceException?

----------------- Редактировать ---------------

Я должен также упомянуть, что, если я запускаю любую из трех проблемных строк в ближайшем окне, я получаю правильные результаты.Я также вижу элементы управления в ControlCollection из pnlForm, когда проверяю их во время отладки.

----------------- 2nd Edit -------------------

Просто для подтверждения я добавил еще одну строку: DropDownList notThere = (DropDownList) pnlForm.FindControl ("notHere");Элемент управления notHere отсутствует на странице.Приведенная выше строка компилируется (конечно), и когда я запускаю отладчик, он работает нормально.Актерский состав идет отлично.Переменная notThere просто равна нулю.

Основной причиной этой проблемы является то, что FindControl не может найти элементы управления и пытается преобразовать ноль в DropDownList или другой элемент управления

Ответы [ 3 ]

8 голосов
/ 28 января 2011

Проблема не в FindControl.

То, как вы его запрограммировали, выполняет две операции в одной строке - FindControl (), а затем приведение к типу данных управления.Это бросок, который бомбардирует, потому что результаты вызова FindControl являются нулевым значением, и вы пытаетесь привести нулевой элемент к элементу управления.

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

object oDropDown1 = pnlForm.FindControl("DropDown1");

// then check if oDrowpDown 1 is null and cast if it's safe.

if(oDropDown1 != null)
{
   // here it's safe to cast.
}
5 голосов
/ 28 января 2011

приведение null к DropDownList приведет к исключению.

, если pnlForm.FindControl("drpQuantity") вернет null, вы не можете его разыграть;)

однако это будет работать:

System.Web.UI.WebControls.DropDownList drpQuantity = 
   pnlForm.FindControl("drpQuantity") as System.Web.UI.WebControlsDropDownList;

if(drpQuantity!=null){
   //use drpQuantity here
}

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

в любом случае , использование findcontrol предназначено только для сгенерированных данными элементов управления , во всех других случаях используйте interface (-implementation) для связи с элементами управления пользовательских элементов управления.

IMHO findcontrol - это функция, которой злоупотребляют во всем мире .... (котят убивают за ее использование)

0 голосов
/ 28 января 2011

Вы получаете исключение NullReferenceException, оно не находит (тот) элемент управления (который вы искали)

попробовать:

DropDownList drpLanguage = (DropDownList)(pnlForm.FindControl("drpLanguage"));
DropDownList drpShipTo = (DropDownList)(pnlForm.FindControl("drpShipTo"));
HiddenField hdnAvailableProductId = (HiddenField)(pnlForm.FindControl("hdnAvailableProductId"));
...