Это важная информация в ваших комментариях:
элемент, который я хочу обновить, находится на 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
new Label()
, когда вы все равно используетеFindControl
одной строкой позже? Это просто сбивает с толку и ничего не делает. - person Tim Schmelter   schedule 20.02.2014(Label)tasksPlaceholder.FindControl("taskdocs_" + taskId);
находит контроль? Разве вы не передаете null вIndexOf()
? - person rocky   schedule 20.02.2014