1

I have the following code :

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

The label is found within the placeholder, but when I call .IndexOf() it always returns -1.

How do I find the correct position of this control?

4

1 回答 1

1

这是您评论中的重要信息:

我要更新的元素向下 3 级(TableRow -> TableCell ->Label)

Control.FindControl查找此控件中的所有控件,NamingContainerControlCollection.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);
于 2014-02-20T14:16:50.477 回答