Как найти индекс элемента управления в заполнителе

У меня есть следующий код:

   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);
Другие вопросы по тегам