查找具有特定ID模式的控件
本文关键字:模式 控件 ID 查找 | 更新日期: 2023-09-27 18:07:33
我有一堆<div>
's在我的项目中使用语法block[number]
命名。例如,block1, block2, block3等
我想在后面的代码中遍历这些,但是我不能让它工作。
基本上,我想做的是告诉代码查找名为block[i]
的控件,其中i
是我负责的计数器。
我想FindControl
,但我不确定这是否会起作用。谢谢!
你可以在你的页面中这样使用:
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(注意它不是递归的,但是,所以如果控件嵌套在其他控件中,你必须自己做递归)。
然而,真正的问题是为什么你想/需要这样做?