我的项目中有一堆<div>
使用语法block[number]
命名。例如,block1,block2,block3等
我想在后面的代码中迭代这些,但我无法让它工作。
基本上我想要的是告诉代码查找名为block[i]
的控件,其中i
是我负责的计数器。
我在想FindControl
,但我不确定这是否有效。谢谢!
答案 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(但请注意它不是递归的,所以如果控件嵌套在其他控件中,则必须执行递归自己)。
然而,真正的问题是你为什么要/需要这样做?