Как найти индекс элемента управления в заполнителе
У меня есть следующий код:
Label docsLabel = new Label();
docsLabel = (Label)tasksPlaceholder.FindControl("taskdocs_" + taskId);
int index = tasksPlaceholder.Controls.IndexOf(docsLabel);
Метка находится внутри заполнителя, но когда я вызываю.IndexOf(), она всегда возвращает -1.
Как мне найти правильное положение этого элемента управления?
1 ответ
Это важная информация в ваших комментариях:
элемент, который я хочу обновить, находится на 3 уровня ниже (TableRow -> TableCell ->Label)
Control.FindControl
находит все управление в этом NamingContainer
в то время как ControlCollection.IndexOf
находит только элементы управления в этом элементе управления. Так, если этот элемент управления содержит, например, таблицу, которая содержит строки и ячейки, а каждая ячейка содержит также элементы управления, все эти элементы управления не будут найдены IndexOf
, только верхний элемент управления ищется.
Control.FindControl
будет искать все элементы управления, которые принадлежат этому NamingContainer
(элемент управления, который реализует INamingContainer
). Таблица / строка / ячейка не реализует ее, поэтому все эти элементы управления также ищутся с FindControl
,
Тем не мение, FindControl
не будет искать через суб NamingContainers
(как GridView
в GridViewRow
).
Это воспроизводит вашу проблему:
protected void Page_Init(object sender, EventArgs e)
{
// TableRow -> TableCell ->Label
var table = new Table();
var row = new TableRow();
var cell = new TableCell();
var label = new Label();
label.ID = "taskdocs_1";
cell.Controls.Add(label);
row.Cells.Add(cell);
table.Rows.Add(row);
tasksPlaceholder.Controls.Add(table);
}
protected void Page_Load(object sender, EventArgs e)
{
Label docsLabel = (Label)tasksPlaceholder.FindControl("taskdocs_1");
int index = tasksPlaceholder.Controls.IndexOf(docsLabel);
// docsLabel != null and index = -1 --> quod erat demonstrandum
}
Как мне найти правильное положение этого элемента управления?
Если вы хотите найти номер строки, которой принадлежит этот ярлык:
Label docsLabel = (Label)tasksPlaceholder.FindControl("taskdocs_1");
TableRow row = (TableRow)docsLabel.Parent;
Table table = (Table)row.Parent;
int rowNumber = table.Rows.GetRowIndex(row);