我有以下代码:
Label docsLabel = new Label();
docsLabel = (Label)tasksPlaceholder.FindControl("taskdocs_" + taskId);
int index = tasksPlaceholder.Controls.IndexOf(docsLabel);
标签位于占位符内,但是当我调用.IndexOf() 它总是返回 -1。
如何找到此控件的正确位置?
这是您评论中的重要信息:
我要更新的元素向下 3 级(表行 -> 表单元格 ->标签)
Control.FindControl
在此NamingContainer
中找到所有控件,而ControlCollection.IndexOf
仅查找此控件中的所有控件。因此,如果此控件包含例如包含行和单元格的表,并且每个单元格还包含控件,则IndexOf
将找不到所有这些控件,仅搜索顶部控件。
Control.FindControl
将搜索属于此NamingContainer
的所有控件(实现 INamingContainer
的控件)。表/行/单元格没有实现它,这就是为什么所有这些控件也都使用 FindControl
搜索。
但是,FindControl
不会搜索子NamingContainers
(如GridViewRow
中的GridView
)。
这会重现您的问题:
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);