FindControl () из UserControl внутри цикла for - PullRequest
0 голосов
/ 21 мая 2010

Я создаю пользовательский элемент управления, который будет иметь серию LinkButtons.

Я объявил все свои кнопки ссылок в верхней части моего класса

LinkButton LB1 = new LinkButton();
LinkButton LB2 = new LinkButton();
//...
LinkButton LB9 = new LinkButton();

, теперь я 'Я хотел бы иметь возможность создавать цикл для доступа ко всем этим кнопкам ссылок, поэтому мне не нужно каждый раз записывать их все.

Я пробовал что-то подобное в моем переопределенном методе CreateChildControls ():

for (int i = 1; i < 10; i++)
        {
            LinkButton lb = (LinkButton)FindControl("LB" + i.ToString());
            lb.Text = i.ToString() + "-Button";
        }

Я получаю исключение о том, что lb.Text ... не установлен в качестве экземпляра объекта.

Я также попытался дать все мои действительные идентификаторы LB1, LB2 и т. Д..

т.е.: LB1.ID = "LB1";

все еще не игральные кости.

как я могу это сделать?

Ответы [ 5 ]

1 голос
/ 21 мая 2010

FindControl работает только после добавления этих элементов управления в коллекцию Controls, и это происходит только внутри метода OnInit. Таким образом, вы получаете исключения, потому что элементы управления LB1, LB2 и т. Д. Не были добавлены в коллекцию Controls, а FindControl возвращает null.

Один из способов сделать это - List<LinkButton>, затем в обработчике событий Init добавить элементы управления в список.

Другой способ, вы можете использовать LINQ для циклического обхода дочерних элементов управления:

var ctrls = Controls.OfType<LinkButton>();

Эта версия будет возвращать все LinkButton элементы управления, поэтому я не уверен, что это именно то, что вы хотите. Опять же, это будет работать только в событии Init или позже в цикле страниц.

Дополнительно

В зависимости от структуры вашей страницы вам может быть лучше использовать Repeater control. Примерно так в вашем файле .aspx / ascx:

<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <asp:LinkButton ID="btn" runat="server" />
    </ItemTemplate>
</asp:Repeater>

Тогда в вашем коде вы будете использовать привязку данных для настройки массива и т. Д.

0 голосов
/ 21 мая 2010

Как упоминали @Alek и @codeka, FindControl будет работать только после их добавления в контейнер, такой как объект Page.

Что вы можете сделать, вместо того, чтобы объявлять их как переменные, вместо этого добавить их в список, например, так:

var linkButtonList = new List<LinkButton>();
linkButtonList.Add(new LinkButton());
linkButtonList.Add(new LinkButton());
etc..

тогда вы можете легко просматривать список, когда вам нужен доступ ко всем элементам управления LinkButton:

foreach (var item in linkButtonList)
{
    // do something with the LinkButton here...
}
0 голосов
/ 21 мая 2010

Что-то вроде этого:

    int btnCount = 10;
    LinkButton[] btns = new LinkButton[btnCount];
    for (int i = 1; i <= btnCount; i++)
    {
        btns[i - 1] = new LinkButton(){
            Text = string.Format("{0} - Button", i) 
        };
    }
0 голосов
/ 21 мая 2010

Я думаю, что FindControl возвращает элементы управления только в непосредственном контейнере, поэтому, если они есть внутри, скажем, элемента DIV или таблицы, он не найдет их. Вы можете использовать вспомогательную функцию, подобную следующей:

public static Control FindControl(Control start, string id)
{
  Control foundControl;
  if (start != null) 
  {
    foundControl = start.FindControl(id);
    if (foundControl != null) 
      return foundControl;

    foreach (Control c in start.Controls) 
    {
      foundControl = FindControl(c, id);
      if (foundControl != null) 
        return foundControl;
    }
  }
  return null;
}

Затем вы можете передать этот или конкретный контейнер в качестве параметра запуска.

0 голосов
/ 21 мая 2010

это определенно найти LinkButton? Мне кажется, что FindControl на самом деле не находит LinkButton.

Подключите отладчик и убедитесь, что lb на самом деле не равен нулю.

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