У меня есть 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 менялся - но почему? У меня есть тот же идентификатор, что и в шаблонах вставки и редактирования, но комментирование этого не имеет значения.
Как оказалось, имя пользовательского управления было изменено - мой 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' в этом случае) элементу управления, а не фактическое имя.
Ого.
После DataBind
элемента управления вы должны использовать:
dvDetailsView.Rows[0].Cells[0].FindControl("ucUserControl")
И убедитесь, что вы делаете это только в режиме редактирования, поскольку элемент управления существует только в EditItemTemplate
.
<asp:TextBox>
.CurrentMode
чтобы увидеть, действительно ли вы находитесь в режиме редактирования.