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

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

   Label docsLabel = new Label();
   docsLabel = (Label)tasksPlaceholder.FindControl("taskdocs_" + taskId);
   int index = tasksPlaceholder.Controls.IndexOf(docsLabel);

Метка находится внутри заполнителя, но когда я вызываю .IndexOf(), она всегда возвращает -1.

Как мне найти правильное положение этого элемента управления?


person Andre J    schedule 20.02.2014    source источник
comment
Почему вы вообще используете new Label(), когда вы все равно используете FindControl одной строкой позже? Это просто сбивает с толку и ничего не делает.   -  person Tim Schmelter    schedule 20.02.2014
comment
Вероятно, потому что метка не является прямым потомком заполнителя.   -  person Candide    schedule 20.02.2014
comment
Действительно ли (Label)tasksPlaceholder.FindControl("taskdocs_" + taskId); находит контроль? Разве вы не передаете null в IndexOf()?   -  person rocky    schedule 20.02.2014
comment
Он находит элемент управления, но не является прямым потомком заполнителя.   -  person Andre J    schedule 20.02.2014
comment
@AndreJ, тогда вы не можете ожидать, что он будет в коллекции элементов управления заполнителя.   -  person Andrei    schedule 20.02.2014
comment
Что ж, тогда просто глупо, что .FindControl() может его найти, но не может быть найден с помощью .indexOf(). В любом случае спасибо, буду планировать   -  person Andre J    schedule 20.02.2014
comment
Это действительно оригинальный код или он упрощен?   -  person Tim Schmelter    schedule 20.02.2014
comment
Просто мысль: если indexof не работает, вы можете просмотреть коллекцию элементов управления заполнителя и проверить равенство ссылок. Одновременно вы можете установить счетчик и увеличить его на 1 по мере проверки. Не очень уверен, что это даст вам правильный индекс.   -  person samar    schedule 20.02.2014
comment
Это исходный код, элемент, который я хочу обновить, находится на 3 уровня ниже (TableRow -> TableCell -> Label   -  person Andre J    schedule 20.02.2014
comment
Спасибо @samar, попробую. Я просто хочу обновить текст элемента управления, кажется, это непросто сделать, если он находится в заполнителе.   -  person Andre J    schedule 20.02.2014
comment
Другим способом может быть написание рекурсивной функции для проверки дочерних элементов управления внутри элемента управления, но тогда вам нужно будет быть осторожным со счетчиком, поскольку он может излишне увеличиваться при рекурсии.   -  person samar    schedule 20.02.2014


Ответы (1)


Это важная информация в ваших комментариях:

элемент, который я хочу обновить, находится на 3 уровня ниже (TableRow -> TableCell -> Label)

Control.FindControl находит все управление в этом < a href="http://msdn.microsoft.com/en-us/library/system.web.ui.control.namingcontainer%28v=vs.110%29.aspx" rel="nofollow">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);
person Tim Schmelter    schedule 20.02.2014