Динамическая загрузка UserControl после нажатия кнопки на другом UserControl - PullRequest
0 голосов
/ 02 июля 2018

У меня проблема с отображением UserControl в моей форме.

Программа в двух словах:

  1. В Form1 у меня есть кнопка. После нажатия этой кнопки в Panel (контейнере) динамически загружается мой первый UserControl (new.cs).
  2. На этой панели у меня есть другая кнопка, которая ведет к другому UserControl (choice.cs), и я хочу отобразить ее в той же панели (контейнере) в моей форме 1.

Первый пункт работает хорошо, но у меня проблема со вторым. Я думаю, что я должен исправить функцию choice_button_Click. Есть ли простой способ сделать это?

Вот мой код:

Form1.cs:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void new_button_Click(object sender, EventArgs e)
        {
            if (!container.Controls.Contains(@new.Instance))
            {
                container.Controls.Add(@new.Instance);
                @new.Instance.Dock = DockStyle.Fill;
                @new.Instance.BringToFront();
            }
            else
            {
                @new.Instance.BringToFront();
            }
        }

        public Panel getContainer()
        {
            return container;
        }
    }
}

new.cs:

namespace WindowsFormsApp1
{
    public partial class @new : UserControl
    {
        private static @new _instance;
        public static @new Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new @new();
                return _instance;
            }
        }

        public @new()
        {
            InitializeComponent();
        }

        private void choice_button_Click(object sender, EventArgs e)
        {
            using (Form1 main = new Form1())
            {
                if (!main.getContainer().Controls.Contains(choice.Instance))
                {
                    main.getContainer().Controls.Add(choice.Instance);
                    choice.Instance.Dock = DockStyle.Fill;
                    choice.Instance.BringToFront();
                }
                else
                {
                    choice.Instance.BringToFront();
                }
            }    
        }
    }
}

choice.cs:

namespace WindowsFormsApp1
{
    public partial class choice : UserControl
    {
        private static choice _instance;
        public static choice Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new choice();
                return _instance;
            }
        }

        public choice()
        {
            InitializeComponent();
        }
    }
}

1 Ответ

0 голосов
/ 05 июля 2018

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

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

Например:

new.cs:

namespace WindowsFormsApp1
{
    public partial class @new : UserControl
    {
        private static @new _instance;
        public static @new Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new @new();
                return _instance;
            }
        }

        public event EventHandler StepCompleted;

        public @new()
        {
            InitializeComponent();
        }

        private void choice_button_Click(object sender, EventArgs e)
        {
            StepCompleted?.Invoke(this, EventArgs.Empty);
        }
    }
}

И Form1.cs:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void new_button_Click(object sender, EventArgs e)
        {
            if (!container.Controls.Contains(@new.Instance))
            {
                container.Controls.Add(@new.Instance);
                @new.Instance.Dock = DockStyle.Fill;
                @new.Instance.BringToFront();
            }
            else
            {
                @new.Instance.BringToFront();
            }
        }

        private void new_StepCompleted(object sender, EventArgs e)
        {
            if (!container.Controls.Contains(choice.Instance))
            {
                container.Controls.Add(choice.Instance);
                choice.Instance.Dock = DockStyle.Fill;
                choice.Instance.BringToFront();
            }
            else
            {
                choice.Instance.BringToFront();
            }
        }
    }
}

Теперь вы, очевидно, собираетесь работать с тем же экземпляром формы, поскольку он сам обрабатывает событие. Кроме того, @new не нужно выполнять какой-либо неловкий поиск, чтобы найти правильный экземпляр Form1 и изменить форму.

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