使用LINQ或任何快速方法从ControlCollection中搜索特定控件

本文关键字:搜索 控件 ControlCollection LINQ 任何快 方法 使用 | 更新日期: 2023-09-27 17:58:07

我有一组控件集合,我正在寻找一种在运行时通过ID添加特定控件的方法,有什么快速、优化的方法可以做到这一点吗?

这是一个代码:

HtmlTableRow row = new HtmlTableRow();
row.ID = string.Format("tr{0}", key);
tableParameters.Rows.Add(row);
HtmlTableCell cellParameterName = new HtmlTableCell();
cellParameterName.ID = string.Format("td{0}", key);
row.Cells.Add(cellParameterName);
Label lblParameterName = new Label();
lblParameterName.ID = string.Format("lblParameter{0}", key);
cellParameterName.Controls.Add(lblParameterName);
lblParameterName.Text = key + ":";
HtmlTableCell cellParameterSelectionControl = new HtmlTableCell();
cellParameterSelectionControl.ID = string.Format("tdSelectionControl{0}", parameterInfos[key].ParameterName);
row.Cells.Add(cellParameterSelectionControl);

Thanx

使用LINQ或任何快速方法从ControlCollection中搜索特定控件

Control.FindControl怎么样?

假设您的表ID为tableExample:

var tr = tableExample.FindControl("tr5");

但请记住,它不是递归的。因此,如果你想得到lblParameter5,你可以先找到每个父元素,直到那个元素:

var tr = tableExample.FindControl("tr5") as HtmlTableRow;
var td = tr.FindControl("td5") as HtmlTableCell;
var lbl = td.FindControl("lblParemeter5") as Label;

或者,您可以创建一个递归函数来执行此操作。下面是一个使用扩展方法创建递归函数的示例:

public static class MyExtensions
{
    public static Control FindById(this Page p, string id)
    {
        return FindControlRecursive(p, id);
    }
    private static Control FindByIdRecursive(Control root, string id)
    {
        if (root.ID == id)
            return root;
        foreach (Control c in root.Controls)
        {
            Control c2 = FindByIdRecursive(c, id);
            if (c2 != null)
                return t;
        }
        return null;
    }
}

所以,你的电话只是:

var lbl = FindById("lblParameter5") as Label;