这是您评论中的重要信息:
我要更新的元素向下 3 级(TableRow -> TableCell ->Label)
Control.FindControl
查找此控件中的所有控件,NamingContainer
而ControlCollection.IndexOf
仅查找此控件中的控件。因此,如果此控件包含例如一个包含行和单元格的表格,并且每个单元格还包含控件,则所有这些控件都不会被 找到IndexOf
,只会搜索顶部控件。
Control.FindControl
将搜索属于此的所有控件NamingContainer
(实现的控件INamingContainer
)。表/行/单元格没有实现它,这就是为什么所有这些控件也用FindControl
.
但是,FindControl
不会搜索 sub- NamingContainers
(如 aGridView
中的 a 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);