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

时间:2011-09-04 08:32:48

标签: c# asp.net controls

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

我想在后面的代码中迭代这些,但我无法让它工作。

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

我在想FindControl,但我不确定这是否有效。谢谢!

3 个答案:

答案 0 :(得分:4)

您可以在页面中使用以下内容:

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可以更好地阅读

答案 1 :(得分:2)

基于CKoenig answer,这里使用简单的List更简单:

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;
});

这将完全相同,只是更优雅。

答案 2 :(得分:0)

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

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

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