Поиск пользовательского элемента управления в TemplateField of DetailsView - PullRequest
2 голосов
/ 19 мая 2009

У меня есть 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 ...

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

РЕДАКТИРОВАТЬ: Оказывается, мой идентификатор usercontrol был изменен - ​​но почему? У меня один и тот же идентификатор в шаблонах вставки и редактирования, но комментировать это не имело значения.

Ответы [ 2 ]

2 голосов
/ 19 мая 2009

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

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

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

1 голос
/ 20 мая 2009

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

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

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

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

РЕДАКТИРОВАТЬ : OMG! Кто-то (на самом деле это не я, клянусь) спрятал свойство ID в классе элемента управления!

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

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

Wow.

...