ASP.NET динамически переназначает элементы управления в дереве элементов управления - PullRequest
2 голосов
/ 02 июня 2009

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

<cc:MyControl runat="server" ID="myc" LinkControlID="NewParent" />

и на той же странице:

<asp:TextBox runat="server" ID="NewParent" />

Что я хотел бы сделать, так это изменить в MyControl родителя NewParent, чтобы он был частью коллекции Controls в MyControl. Когда я пытаюсь сделать это из OnInit, я получаю:

Невозможно изменить коллекцию элементов управления на этапах DataBind, Init, Load, PreRender или Unload.

Что имеет смысл, но есть ли способ обойти это? Я в порядке, если NewParent остается дочерним элементом страницы до тех пор, пока из MyControl я могу каким-то образом перенаправить рендеринг в элемент управления MyControl.

Можно ли это сделать? Спасибо.

EDIT

Для пояснения вот макет MyControl:

public class MyControl : Panel
{
  protected override void OnInit(System.EventArgs e)
  {
    base.OnInit(e);
    if (!String.IsNullOrEmpty(LinkControlID))
    {
      Control link = Parent.FindControl(LinkControlID);
      if (link != null)
      {
        Controls.Add(link);
      }
    }
  }
  public string LinkControlID { get; set; }
}

Это предполагает, что MyControl и LinkControlID размещены на одном уровне в древовидной иерархии, что нормально в моем случае.

Ответы [ 3 ]

1 голос
/ 02 июня 2009

почему бы вам не попробовать добавить его в Page_LoadComplete

myc.Controls.Add(NewParent);
0 голосов
/ 04 августа 2011

@ Предложение TheVillageIdiot сработало для меня:

protected void Page_Init(object sender, EventArgs e)
{
  Page.LoadComplete += Page_LoadComplete;
}

private void Page_LoadComplete(object sender, EventArgs e)
{
  if (InHeader)
  {
    Page.Header.Controls.Add(this);
  }
}

Имейте в виду, у меня были другие требования, но я не думаю, что это должно быть проблемой, если вы можете получить доступ к новому родительскому элементу управления из вашего MyControl. Общий формат - добавить прослушиватель событий на Page для внесения изменений на LoadComplete.

0 голосов
/ 02 июня 2009

Я не мог воспроизвести его, но, как предположил aman.tur, вы пробовали другое событие? Переопределение CreateChildControls() кажется подходящим местом для этого.

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