Перезапустите UserControl в Windows приложении Forms (. Net Framework) C# - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть приложение Windows Forms в C# с несколькими элементами UserControls.

В UserControl1 я создаю панели динамически, каждая панель содержит несколько элементов (флажок, список меток, графический блок и несколько комбинированных списков) , Значения внутри этих элементов различаются между панелями, потому что я импортирую значения из базы данных. Также я могу добавлять или удалять элементы из списка. По сути, каждая панель представляет собой презентацию для меню «Пицца», где вы выбираете размер (каждый размер имеет свою цену) и добавляете или удаляете ингредиенты (из списка).

Если вы выберете один (или несколько) из пицца добавляется в UserControl2 (обозначен как корзина). Вы можете выбрать несколько (разных) элементов пиццы из UserControl1, и все они появятся в UserControl2 в «корзине покупок».

Все эти элементы UserControls содержатся на панели в форме и могут быть доступны нажав соответствующую кнопку.

Мой вопрос: как мне перезагрузить UserControl1 из UserControl2?

По сути, после того, как я сделал "заказ" (который может иметь несколько различных элементов ), Я хочу сделать новый «заказ» и хочу, чтобы UserControl1 выглядел так же, как и при запуске приложения.

Я понимаю, что должен вызывать метод UserControl1_Load (), но как это сделать? Я делаю это из UserControl2?

Или есть еще один способ "сброса" UserControl1?

Очевидно, я вроде как новичок в C#, поэтому, пожалуйста, помилуйте моя душа.

Большое спасибо заранее за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Вызов метода Load () может быть недостаточным. Если вам нужно поведение полного сброса, вы можете удалить текущий элемент управления и добавить новый элемент вместо него.

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

public EventHandler OnOrderCompleted;

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

private void button1_Click(object sender, EventArgs e)
{
    if (OnOrderCompleted != null)
    {
        OnOrderCompleted.Invoke(this, new EventArgs());
    }
}

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

public Form2()
{
    InitializeComponent();
    orderControl.OnOrderCompleted += OnOrderCompleted;
}

private void OnOrderCompleted(object sender, EventArgs e)
{
    Point currentLocation = productsControl.Location;
    Controls.Remove(productsControl);
    productsControl = new UserControl1();
    productsControl.Location = currentLocation;
    Controls.Add(productsControl);
}

Надеюсь, это поможет.

0 голосов
/ 29 апреля 2020

Я бы реализовал интерфейс, который должен реализовывать каждый UserControl для поддержки этой функции. Интерфейс - это контракт, описывающий, что элемент управления реализовал метод. Просто попробуйте привести все пользовательские элементы управления к этому интерфейсу для поддержки функции перезапуска.

Вы должны изменить его для своих нужд, но вот пример:

public interface ISupportInitialize
{
    void Initialize();
}

public partial class MyUserControl : UserControl, ISupportInitialize
{
    public MyUserControl()
    {
        // whatever you need to initialize
        Initialize();
    }

    public void Initialize()
    {
        // remove old content if exists
        // add new content
    }
}

А в вашем главном окне:

public void ReInitializeControls()
{
    // assume that panel1 contains the controls.
    var userControlsWithInitialize = panel1.Controls.OfType<ISupportInitialize>();

    foreach(var control in userControlsWithInitialize)
        control.Initialize();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...