c # \ не может загрузить пользовательский элемент управления с другой кнопки управления пользователем - PullRequest
1 голос
/ 15 марта 2019

Я тестирую этот код в приложении c # windows form. Вот тест, который я делаю.

enter image description here

Panel1 имеет кнопку «p1Button». «UserControl1» имеет «uc1Button» Нажмите «p1Button», чтобы загрузить «UserControl1» в Panel1
Я не могу найти панель 2, когда я нажимаю на событие "uc1Button"

это возможно или какие-либо предложения?

// Form1.cs

using System;
using System.Windows.Forms;

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

        private void p1Button_Click(object sender, EventArgs e)
        {
            if (!panel1.Controls.Contains(UserControl1.Instance))
            {
                panel1.Controls.Add(UserControl1.Instance);
                UserControl1.Instance.BringToFront();
            }
            else
            {
                UserControl1.Instance.BringToFront();
            }
        }
    }
}

// UserControl1.cs

using System;
using System.Windows.Forms;

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

        private void uc1Button_Click(object sender, EventArgs e)
        {

        }
    }
}

// UserControl2.cs

using System.Windows.Forms;

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

1 Ответ

0 голосов
/ 15 марта 2019

Прежде всего, вы не должны устанавливать элементы управления как синглтоны. Во-вторых, вы должны знать границы родитель-дети.

Ваш родитель - это Форма. Форма имеет две детские - панели. Панель 1 имеет еще двух детей - ваш пользовательский контроль и кнопку. В вашем пользовательском контроле есть другие дети - кнопка.

Итак, если вы хотите поместить что-то на панель два из usercontrol1, у вас есть как минимум два варианта:

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

  2. Хороший путь. Просто и хорошо. Добавьте обработчик событий в свой usercontrol, например:

    public UserControl1: UserControl { открытое событие EventHandler ButtonClicked; }

, а затем нажмите кнопку в пользовательском элементе управления:

ButtonClicked?.Invoke(this, EventArgs.Empty);

Затем вам нужно зарегистрировать основную форму для этого обработчика:

UserControl1.ButtonClicked += (s, e) =>
{
    //show usercontrol2 on your panel.
}

Вы должны прочитать больше об делегатах и ​​событиях в C #.

...