DataGridItem.FindControl не находит элемент управления? (ASP.NET)

#asp.net #findcontrol

#asp.net #findcontrol

Вопрос:

 Label lbl = dgi.FindControl("LBL_MyLabel") as Label; 
  

В большинстве случаев это работает, но иногда значение lbl равно нулю после вызова FindControl. Мне интересно, как это могло произойти. Он должен быть там или нет? Есть идеи?

Метка определяется следующим образом:

 <asp:Label ID="LBL_MyLabel" runat="server"></asp:Label>
  

Спасибо 🙂

Ответ №1:

Каков более широкий контекст кода вокруг вызова FindControl ? Эта ошибка обычно возникает при переборе строк в сетке (например, в RowDataBound событии) без условной проверки типа строки:

 if (e.row.RowType == DataControlRowType.DataRow)
{
  // your code
}
  

Обертывание его этим условием приведет к пропуску строк верхнего и нижнего колонтитулов, в которых, вероятно, нет вашего элемента управления label.

Комментарии:

1. Он находится внутри TemplateColumn в моей сетке и вызывается в методе ItemDataBound сетки. Вокруг него нет специального if (чего-то).

2. @grady: ItemDataBound ? Звучит как классика DataGrid . Также похоже, что это та же проблема, просто другой синтаксис. Для этого вам, вероятно, потребуется условное выражение типа: if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))

3. @grady: Не уверен. Есть ли что-нибудь другое в шаблоне переменного элемента? Какие элементы управления находятся внутри элемента при отладке? И наоборот, если вы задаете условию только для обработки ItemType s of ListItemType.Item , то перехватывает ли оно все ваши строки?

4. Как мне узнать элементы управления в элементе?

5. @grady: У меня нет ничего удобного для проверки этого, но e должно быть типа DataGridItem , который должен иметь Controls свойство. Это было бы лучшим местом для начала. Я предполагаю, что иерархия элементов управления будет доступна там, но я не уверен на 100%. Это может стать облачным в зависимости от того, насколько динамично все это и в какой момент все привязано / создано.