Загрузка одного пользовательского элемента управления после загрузки другого - ASP.NET WebForms - PullRequest
1 голос
/ 10 декабря 2010

У меня есть UserControl A, который должен быть загружен первым, а после того, как он завершает загрузку, мне нужно загрузить UserControl B.

Я предпочитаю добавлять оба этих пользовательских элемента управления на страницу во время компиляции (по возможности избегать динамической загрузки).

  • Если я добавляю пользовательские элементы управления на страницу во время компиляции и устанавливаю видимое значение false для пользовательского элемента управления B, выполняет ли он код B? После этого я могу установить для видимости значение true после загрузки пользовательского элемента управления A
  • Должен ли я использовать события / делегаты для уведомления о завершении загрузки пользовательского элемента управления A?

Ответы [ 4 ]

3 голосов
/ 10 декабря 2010

Не загружайте все в событие страницы в элементе управления b, просто поместите метод в элемент управления b для вызова. Затем добавьте событие, управляющее тем, которое потребляет страница, при возникновении события вызовите метод load для элемента управления b.

Редактировать: SampleCode

Хорошо, например, создайте

  • страница ASPX
  • 2х пользовательских элементов управления

Поместите оба пользовательских элемента управления на страницу aspx.

    <cc:control1 runat="server" id="control_one" />
    <cc:control2 runat="server" id="control_two" />

Затем в control 1 создайте делегат и событие.

    public delegate void MyCustomEvent (EventArgs args);
    public event MyCustomEvent MyEvent;

    protected void Page_Load(object sender, EventArgs e)
    {
        MyEvent(e);
    }

Итак, у меня возникло событие при загрузке страницы. Таким образом, у вас будет логика, необходимая, когда вы закончите, вызовет событие MyEvent.

На странице вы хотите добавить обработчик для этого события, чтобы при его вызове вы могли что-то с ним сделать.

    protected override void OnInit(EventArgs e)
    {
        control_one.MyEvent += new WebUserControl1.MyCustomEvent(control_one_MyEvent);
        base.OnInit(e);
    }

    void control_one_MyEvent(EventArgs args)
    {
        control_two.MyCustomLoad();
    }

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

Тогда во втором контроле у ​​меня есть:

    public void MyCustomLoad()
    {
        //Stuff only loaded when event is raised and calls this method.
    }

Таким образом, это позволяет элементу управления 1 загружать что-то, скажем, что оно выполнено, когда страница знает, что оно выполнено, оно может сказать элементу управления 2 что-то сделать.

Изменить: После обсуждения этого с другом я объясню, что я имею в виду, контролируя порядок.

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

Если вы покончили с жизненным циклом страницы, вы можете получить степень, как показано в моем примере выше, создать способ управления порядком отображения элементов управления. Вызывая событие (события) в определенные моменты, когда контроль А завершен, вы можете сказать контролю Б сделать что-то.

Промежуточным звеном между этими двумя элементами управления является страница, которая обрабатывает события, вызванные элементом управления A, который вызывает метод для элемента управления B. Вы (хорошо, вы можете взломать его, чтобы сделать это) Элемент управления A указывает элементу управления B сделать что-то, потому что это создает прямую зависимость между двумя элементами управления, что плохо.

1 голос
/ 10 декабря 2010
  • Да, код по-прежнему будет работать
  • События могут быть полезны

Но если ваши элементы управления имеют определенную зависимость друг от друга, может быть, они должны быть просто одним элементом управления?

1 голос
/ 10 декабря 2010

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


Для решения проблемы "Филла" с парой элементов управления Order / Orderlines:

Я предполагаю, что элемент управления Order был разработан, потому чтоэто полезно само по себе.Я предполагаю, что OrderLines был разработан, чтобы иметь возможность отображать позиции для данного заказа, отображаемого элементом управления Order.

Я утверждаю, что должен быть один составной элемент управления, который объединяет Order и OrderLines.этот элемент управления перейдет к элементу управления OrderLines, источнику данных, состоящему из отображаемых позиций.Это делает OrderLines независимым от любого другого элемента управления - он просто отображает данные, которые ему сообщают для отображения.Он не знает, откуда поступили эти данные.

Обратите внимание, что это может распространиться на типичный сценарий сетки / деталей / линий деталей, где вы передаете сетке набор заказов;когда выбрано, конкретная строка сетки пройдет контроль ордера выбранного ордера;когда пришло время отображать позиции, передайте коллекцию позиций текущего заказа в элемент управления OrderLines и т. д.

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

0 голосов
/ 15 декабря 2010

"У меня есть UserControl A, который должен быть загружен первым, а после того, как он завершает загрузку, мне нужно загрузить UserControl B.

Я предпочитаю добавлять оба этих пользовательских элемента управления на страницу во время компиляции (по возможности избегать динамической загрузки). «

Я бы предложил использовать WebFormsMVP: -

http://webformsmvp.com/ http://wiki.webformsmvp.com/index.php?title=Main_Page

Помимо хорошей реализации Model-View-Presenter, одной из наиболее полезных функций этой платформы является поддержка обмена сообщениями.

В двух словах, вы создаете типы сообщений, и ваши пользовательские элементы управления (представления) могут публиковать сообщения любого типа, которые вам нужны, на шину сообщений. Другие элементы управления могут подписываться на сообщения определенного типа, и платформа WebFormsMVP обеспечит их доставку.

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

Ваш единственный другой вариант - использовать динамическую загрузку элементов управления, поскольку, как отмечали другие, вы не можете полагаться на порядок, в котором ASP.NET загружает элементы управления в контейнер.

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