Использование других классов для изменения панели в Windows Forms - PullRequest
0 голосов
/ 24 апреля 2019

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

Более конкретно, у меня есть ParentInterface.cs, где я хочу показать ChoreUI в динамической панели, которая будет изменена в новом классе под названием ChoreUI.cs.

Я пытался заставить ChoreUI наследовать от ParentInterface, а также сделать его целью. Хотя мое отсутствие знаний о Windows Forms мешает.

ParentInterface.cs

namespace ChoreApplication.UI{
public partial class ParentInterface : Form
{
    private ChoreUI ChoreUI;
    private ParentInterface PUI;
    public ParentInterface()
    {
        ChoreUI = new ChoreUI(PUI);
        InitializeComponent();
    }
    private void ChoreNavButton_Click(object sender, EventArgs e)
    {
        var ChoreUI = new ChoreUI(PUI);
        ChoreUI.DillerDaller();
    }
}

ChoreUI.cs

namespace ChoreApplication.UI
{
    class ChoreUI
    {
    public ParentInterface PUI;

    public ChoreUI(ParentInterface PUI)
        {
            this.PUI = PUI;
        }

    public void DillerDaller()
    {
        PUI.dynamicPanel.Controls.Add(new Label { Location = new Point(10, 10), Name="textName", Text = "hello"});
    }
}

Я хочу иметь возможность добавлять новые элементы управления в Panel из класса ChoreUI вместо класса ParentInterface. Но пока мне это не удается.

1 Ответ

1 голос
/ 24 апреля 2019

То, что у вас есть на данный момент, не , что плохо, ваш дочерний компонент имеет ссылку на родительский элемент, и это нормально.

Это, однако, проблема

public void DillerDaller()
{
    PUI.dynamicPanel.Controls.Add(new Label { Location = new Point(10, 10), Name="textName", Text = "hello"});
}

На базовом уровне вы нарушаете принцип инкапсуляции, где dynamicPanel - это protected внутри формы, так что он недоступен извне. Наследование дочернего компонента из главной формы не является правильным решением.

На более высоком уровне вы нарушаете здесь так называемый Закон Деметры , где не следует злоупотреблять внутренними деталями реализации компонента. Изменение видимости dynamicPanel на public не поможет. Скорее, правило гласит, что вы должны обернуть такие детали реализации стабильным интерфейсом

public partial class ParentInterface : Form
{
    ...

    public void AddDynamicPanelControl( Control control ) {
      this.dynamicPanel.Controls.Add( control );
    }
    public void RemoveDynamicPanelControl( Control control ) {
      this.dynamicPanel.Controls.Remove( control );
    }
}

и использовать недавно представленный интерфейс

public void DillerDaller()
{
    var label = new Label { Location = new Point(10, 10), Name="textName", Text = "hello"};
    this.PUI.AddDynamicPanelControl( label );

    // if you store the reference to the label somewhere,
    // you'll be able to call `Remove....` to remove this control from 
    // the form
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...