переключать usercontrols в mainform внутри события клика usercontrol - PullRequest
4 голосов
/ 08 марта 2019

Это может звучать глупо, но мне трудно это понять;любая помощь будет оценена:

У меня есть два пользовательских элемента управления, которые называются « Safety_Check » и « OEE_Track ».В моем MainForm у меня есть панель с именем « pnl_main_controller », именно здесь я отображаю оба моих пользовательских элемента управления.У меня есть две кнопки в основной форме, и я динамически переключаюсь между ними без каких-либо проблем.

Safety_Check Пользовательский контроль;

public partial class Safety_Check : UserControl
    {
        private static Safety_Check _instance;

        public static Safety_Check instance
        {
            get
            {
                if (_instance == null)
                    _instance = new Safety_Check();
                return _instance;
            }
        }

        public Safety_Check()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ///////------------------------
        }

    }

OEE_Track Пользовательский контроль

public partial class OEE_Track : UserControl
    {

        private static OEE_Track _instance;

        public static OEE_Track instance
        {
            get
            {
                if (_instance == null)
                    _instance = new OEE_Track();
                return _instance;
            }
        }

        public OEE_Track()
        {
            InitializeComponent();
        }
    }

MainForm:

public partial class MainForm : Form
    {
     private void btn_reg_Click(object sender, EventArgs e)
        {
            if (!pnl_main_controller.Contains(Safety_Check.instance))
            {
                pnl_main_controller.Controls.Add(Safety_Check.instance);
                Safety_Check.instance.Dock = DockStyle.Fill;
                Safety_Check.instance.BringToFront();
            }
            else
            {
                Safety_Check.instance.BringToFront();
            }        }

       private void btn_OEE_Click(object sender, EventArgs e)
        {
            if (!pnl_main_controller.Contains(OEE_Track.instance))
            {
                pnl_main_controller.Controls.Add(OEE_Track.instance);
                OEE_Track.instance.Dock = DockStyle.Fill;
                OEE_Track.instance.BringToFront();
            }
            else
            {
                OEE_Track.instance.BringToFront();
            }
     }

То, что я пытаюсь сделать, это то, что у меня есть кнопка с названием « Button1 » на моем « Safety_Check »Usercontrol, всякий раз, когда я нажимаю это, я хочу, чтобы« Safety_Check »исчезал на« pnl_main_controller »и выводил« OEE_Track ”на панель

Ответы [ 2 ]

4 голосов
/ 12 марта 2019

Существует несколько решений для взаимодействия между элементами управления. Элементы управления - это классы, и, как и любой другой класс, они могут взаимодействовать друг с другом, используя свои открытые свойства и методы или используя некоторый посредник.

В этом случае ваши элементы управления не должны знать друг друга и не должны напрямую взаимодействовать друг с другом:

  • Они могут попросить другой объект, который знает оба элемента управления, выполнить работу за них.
  • Или они могут подать уведомление о своем запросе, и тот, кто подписался на это уведомление, будет его обслуживать.

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

Для получения уведомления о запросе простое решение основывается на событиях. Вы можете создать событие в дочернем элементе управления и вызвать его, когда вам нужно, чтобы родитель сделал что-то для вас. Затем в родительском подпишитесь на это событие и сделайте задание.

Пример - Использование события

Я предполагаю, что у вас UserControl1 есть Button1 внутри, и вы обработали Click событие Button1. Затем вы можете создать Button1Clicked событие и поднять его, когда Button1 нажмет:

public event EventHandler Button1Clicked;
private void Button1_Click(object sender, EventArgs e)
{
    Button1Clicked?.Invoke(this, e);
}

Затем в родительской форме подпишитесь на событие и делайте что хотите:

private void userControl11_Button1Clicked(object sender, EventArgs e)
{
    //Hide userControl11 and show userControl21 
}

Пример - Использование интерфейса

Полагаю, у вас есть интерфейс, имеющий несколько стандартных методов:

public interface IDoSomething
{
    void DoSomething();
    void DoSomethingElse();
}

И вы реализовали интерфейс в родительской форме:

public class Form1: Form, IDoSomething
{
    // ...

    public void DoSomething()
    {
        //Hide userControl11 and show userControl21 
    }
    public void DoSomethingElse()
    {
        // ...
    }
}

Тогда у вас пользовательский контроль:

private void Button1_Click(object sender, EventArgs e)
{
    var f = FindForm() as IDoSomething;
    if(f!=null)
        f.DoSomething();
}
1 голос
/ 18 марта 2019

Я хочу немного расширить ответ Резы Агаи. Я думаю, что это может стать даже лучше, чем сейчас.

Первый способ сделать это

На вашем месте у меня был бы какой-то интерфейс ICheckedView, в котором есть хотя бы 1 метод для реализации, например:

ICheckedView
{
    void Continue();
}

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

Наконец , вам нужно добавить либо открытое свойство, либо , может быть, даже параметр к конструктору для Safety_Check, который включает в себя ICheckedView. Когда щелкает ваш элемент контроля безопасности, он может сказать, кто бы ни был передан в него (скажем, клиент), что он должен продолжаться.

Второй способ сделать это

Это можно сделать с помощью делегата действия .

Если вы добавите Action делегат к вашей проверке безопасности, вы можете просто использовать любой метод, чья подпись соответствует этому делегату (void methodName()). Конструктор для вашего элемента управления Safety_Check должен включать в себя действие, и это действие будет присвоено закрытому полю класса. Затем, когда пришло время вызывать, это действие может быть вызвано напрямую.

Примечания к этому методу

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

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