Поиск пользовательского элемента управления в TemplateField of DetailsView

2

У меня есть DetailsView, который я отправляю обратно - и внутри этого есть UserControl. Мне трудно найти его в данных обратной передачи.

В качестве примера:

<asp:DetailsView ID="dvDetailsView" runat="Server" AutoGenerateRows="false">
<Fields>
  <asp:TemplateField>
    <ItemTemplate>
      Some text here
    </ItemTemplate>
    <EditItemTemplate>
      <uc:UserControl ID="ucUserControl" runat="server" />
    </EditItemTemplate>
    <InsertItemTemplate>
      <uc:UserControl ID="ucUserControl" runat="server" />
    </InsertItemTemplate>
  </asp:TemplateField>
</Fields>
</asp:DetailsView>

Когда я вернусь назад, я бы предположил, что сделаю что-то вроде этого:

MyUserControlType ucUserControl = dvDetailsView.FindControl("ucUserControl") as MyUserControlType;

Но это ничего не находит. На самом деле, я даже не могу найти этого ребенка, идя в QuickWatch...

Что мне нужно сделать, чтобы найти эту вещь?

EDIT: Оказывается, мой идентификатор usercontrol менялся - но почему? У меня есть тот же идентификатор, что и в шаблонах вставки и редактирования, но комментирование этого не имеет значения.

Теги:
detailsview
findcontrol

2 ответа

1
Лучший ответ

Как оказалось, имя пользовательского управления было изменено - мой usercontrol, обозначенный как "ucUserControl", изменил его имя на общее имя - "ctl01".

Итак, сделав dvSituation.Rows[0].Cells[0].FindControl("ctl01") найденный элемент управления.

Чтобы найти этот идентификатор, я просто посмотрел на визуализируемый HTML-элемент и проверил родителя с идентификатором, например. 'ctl00_MainContent_dvDetailsView_ctl01_lblLabel', где lblLabel появился на ucUserControl.

Столбец строк представляет собой индекс на основе 0 из числа полей, а индекс ячеек будет равен 1, если у вас указан указанный headertemplate.

EDIT: OMG! Кто-то (это действительно был не я, клянусь) скрыл свойство ID в классе управления!

public partial class UserControl : BaseControl
{
  public int Id;
}

Это означало, что когда ASP.Net генерировал идентификатор, он не мог и просто назначал общий идентификатор ('ctl01' в этом случае) элементу управления, а не фактическое имя.

Ого.

2

После DataBind элемента управления вы должны использовать:

dvDetailsView.Rows[0].Cells[0].FindControl("ucUserControl")

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

  • 0
    Все еще не могу найти этот элемент управления, хотя у меня есть другой, который я могу найти (это просто элемент управления <asp:TextBox> .
  • 0
    Вы уверены, что ваше представление данных находится в режиме редактирования, и вы делаете это после DataBinding? Я только что проверил, и это сработало. Проверьте свойство CurrentMode чтобы увидеть, действительно ли вы находитесь в режиме редактирования.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню