Поиск элементов управления с определенным шаблоном идентификатора - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть группа <div> в моем проекте, названная с использованием синтаксиса block[number].Например, block1, block2, block3 и т. Д.

Я хочу перебрать их в приведенном ниже коде, но не могу заставить его работать.

В основном то, что я хочу сделатьэто сказать коду искать элемент управления с именем block[i], где i - счетчик, о котором я забочусь.

Я думал FindControl, но я не уверен, будет ли это работать.Спасибо!

Ответы [ 3 ]

4 голосов
/ 04 сентября 2011

вы можете использовать что-то вроде этого на своей странице:

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 лучше читать

2 голосов
/ 04 сентября 2011

На основании ответа 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 - это идентификатор удерживающей панеливсе блоки)

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

Что будет делать то же самое, только большеэлегантно.

0 голосов
/ 04 сентября 2011

FindControl будет работать, только если элементы управления являются серверными элементами управления (т. Е. Имеют атрибут runat="server").

Вы можете пометить теги div с помощью runat = "server", а затем можетеиспользуйте для них FindControl (однако имейте в виду, что он не рекурсивный, поэтому, если элементы управления вложены в другие элементы управления, вам придется выполнять рекурсию самостоятельно).

Однако реальный вопрос заключается в том, почему вы хотите /нужно это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...