查找具有特定ID模式的控件

本文关键字:模式 控件 ID 查找 | 更新日期: 2023-09-27 18:07:33

我有一堆<div> 's在我的项目中使用语法block[number]命名。例如,block1, block2, block3等

我想在后面的代码中遍历这些,但是我不能让它工作。

基本上,我想做的是告诉代码查找名为block[i]的控件,其中i是我负责的计数器。

我想FindControl,但我不确定这是否会起作用。谢谢!

查找具有特定ID模式的控件

你可以在你的页面中这样使用:

void IterAllBlocks(Control container, Action<Control> workWithBlock)
{
    foreach(var ctr in container.Controls.Cast<Control>)
    {
       if (ctr.Name.StartsWith("block")
          workWithBlock(ctr);
       if (ctr.Controls.Count > 0) IterAllBlocks(ctr, workWithBlock);
    }
}
使用

IterAllBlocks(this, block => { /* do something with controls named "block..." here */ });

PS:对于FindControl,您需要完整的标识符-您可以尝试"猜测"它们,例如

for(i = 1; true; i++)
{
   var id = string.Format("block{0}"i);
   var ctr = this.FindControl(id);
   if (ctr == null) break;
   // do what you have to with your blocks
}

但是我觉得LINQ的读起来更好

根据CKoenig的回答,这里是一个更简单的使用简单列表:

void GetAllBlocks(Control container, List<HtmlGenericControl> blocks)
{
    foreach(var ctr in container.Controls.Cast<Control>)
    {
        if (ctr.Name.StartsWith("block") && ctr is HtmlGenericControl)
            blocks.Add(ctr);
        if (ctr.Controls.Count > 0)
            GetAllBlocks(ctr, blocks);
    }
}

现在使用它有这样的代码:(pnlContainer是面板持有所有块的ID)

List<HtmlGenericControl> blocks = new List<HtmlGenericControl>();
GetAllBlocks(pnlContainer, blocks);
foreach (HtmlGenericControl block in blocks)
{
    block.InnerHtml = "changed by code behind, id is " + block.Id;
}

当你变得更"高级"时,使用答案的原始代码,然后有这个:

IterAllBlocks(pnlContainer, block => {
    block.InnerHtml = "changed by code behind, id is " + block.Id;
});

将做完全相同的事情,只是更优雅。

FindControl仅在控件为服务器控件(即具有runat="server"属性)时才有效。

你可以用runat="server"标记div标签,然后你可以对它们使用FindControl(注意它不是递归的,但是,所以如果控件嵌套在其他控件中,你必须自己做递归)。

然而,真正的问题是为什么你想/需要这样做?