Member 14063275 Ответов: 1

Вопрос после открытия UserControl из одного пользовательского элемента управления на кнопку нажать


У меня есть несколько UserControls в моем приложении C# Windows Form при нажатии кнопки на главной форме он будет пристыковываться к области на моей главной форме.

Первый usercontrol (IncomeUC) закрепляется в панели (panelContainer) на моей главной форме при нажатии кнопки Income на моей главной форме. Этот UC содержит кнопку (Add Income), которая после нажатия открывает следующий usercontrol (AddIncomeUC).

Но как только AddIncomeUC открывается, когда я нажимаю на кнопку Income в моей основной форме, чтобы просмотреть IncomeUC (или даже если я нажимаю любую другую кнопку, чтобы просмотреть другие основные UCs), он не виден, и AddIncomeUC остается видимым.

Есть ли способ устранить эту проблему? Как я могу заставить AddIncomeUC скрыть/закрыть, как только я нажму другую кнопку?

Что я уже пробовал:

Именно так открывается incomeUC в основной форме

private void btnIncome_Click(object sender, EventArgs e)
    {
        //when click the income button open the income records view
        //incomeUC1.BringToFront();

        this.panelContainer.Controls.Remove(dashboardUC1);
        this.panelContainer.Controls.Remove(expenseUC1);
        this.panelContainer.Controls.Remove(payerPayeeUC1);
        this.panelContainer.Controls.Remove(reportsUC1);
        this.panelContainer.Controls.Remove(predictionUC1);

        this.panelContainer.Controls.Add(incomeUC1);
        lblViewTitle.Text = "Your Income";
    }


таким образом, открывается AddIncomeUC когда нажать на кнопку Добавить доход на IncomeUC

public partial class IncomeUC : UserControl
{
    AddIncomeUC addIncomeUC1;
    public IncomeUC()
    {
        InitializeComponent();
        addIncomeUC1 = new AddIncomeUC();
    }

    private void btnAddIncome_Click(object sender, EventArgs e)
    {
        this.Hide();
        this.Parent.Controls.Add(addIncomeUC1);
    }
}

1 Ответов

Рейтинг:
6

OriginalGriff

Не делай этого так.
Идея usercontrols заключается в том, что они являются автономными объектами, они не должны знать друг о друге (или даже о каком-либо родителе). Вместо этого они взаимодействуют с родительским контейнером (вашей формой) через события и свойства точно так же, как вы это делаете с отдельными формами.

Ваша форма создает первый элемент управления usercontrol и обрабатывает событие. Когда пользовательский элемент управления вызывает событие, он удаляет исходный элемент управления UserControl, и добавляет новый, обработке события от этого. Это звучит сложно, но на практике это не так - это именно то, что вы делали со всеми другими элементами управления, даже со своим .Чистые!

Вы можете посмотреть здесь: Передача информации между двумя формами, Часть 3: Ребенок ребенку[^] - он основан на форме, но это точно такой же процесс (и даже почти такой же код!) для объектов UserControl.


Member 14063275

Спасибо за ваш ответ. Я прошел через это, но я не понимаю этой логики.

OriginalGriff

Какой кусочек? Это же базовая техника упс!

Member 14063275

Извините меня за недостаток знаний, так как я новичок в c#. Я не понял "дочернее событие формы" и "родитель затем передает информацию в обработчике событий" разделов этой статьи.

OriginalGriff

ОК. Простите меня заранее, если я говорю через вашу голову или учу вашу бабушку сосать яйца - я не знаю, что вы делаете, и не знаю, и я не могу видеть, когда ваши глаза начинают стекленеть! Так что, если я выше твоего понимания, скажи мне, и то же самое, если ты научился этому давным-давно, хорошо?

Что вы знаете о событиях?
Вы знаете, что вся система основана на них, да? Когда вы нажимаете кнопку, она вызывает событие, и это приводит к выполнению любого обработчика.

Таким образом, в вашей дочерней форме (или usercontrol) вы создаете событие - код для этого довольно прост:
https://www.codeproject.com/Articles/400287/A-simple-code-snippet-to-add-an-event
Показывает код и простой способ добавить его в VS таким же образом, как вы набираете вкладку "prop" TAB для создания шаблона свойств.
Когда вы создаете usercontrol в ответ на кнопку, Вы можете добавлять события в экземпляр элемента управления - вы это знаете, верно?

Member 14063275

Спасибо, что нашли время все мне объяснить. Да, я знаю, что кнопка вызывает событие onclick. Таким образом, в моем втором пользовательском элементе управления у меня должно быть событие типа "public event EventHandler AddIncome; "плюс виртуальный метод, связанный с ним?

OriginalGriff

Зависит от того - трудно быть точным, не имея возможности видеть ваш экран - идея заключается в том, что один пользовательский элемент управления не должен знать о другом или даже о его контейнере. Это не зависит от UserControl, чтобы решить, что происходит, он просто говорит своему контейнеру, что "пользователь сделал это".
Таким образом, IncomeUC вызывает событие, когда пользователь нажимает кнопку AddIncome, а содержащая его форма обрабатывает это событие и решает, что произойдет. Она закрывает элемент управления UserControl, создает второй, и показывает, что.
Таким образом, только те элементы, которые должны знать о классах, имеют к ним какое - то отношение-форма добавляет UserControls, поэтому она должна знать, но сами элементы управления полностью независимы и вообще не знают о внешнем мире. Это часть того, что такое Упс!

В этом есть смысл?

Member 14063275

Да, теперь я понял это немного лучше. Я попробую это сделать. Спасибо.

OriginalGriff

Всегда пожалуйста!
Звучит сложно, но это действительно легко, когда вы получаете вашу голову вокруг него.

BillWoodruff

+5 Еще один отличный пример одного из лучших QA-ответчиков CodeProject ... иду на такое расстояние !

@originallgriff : как вы думаете, было бы добавить к этой теме, чтобы показать другую технику, использующую статический класс switchboard для обработки переходов пользовательского интерфейса ?

OriginalGriff

Вы могли бы - но я думаю, что он немного слишком много на стороне новичка вещей на этой стадии!