Передача данных и вызов функций между формами без необходимости делать их статичными - C # - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть следующий статический метод, который добавляет выбранный продукт в заказ.

    public static void addToOrderFromPicture(string product, string qty, string _price)
    {
        //I've cut the code as it's not important to the question.
        order.Add(product);

    }

Продукты отображаются в виде элементов управления на панели макета потока.Пользователь нажимает кнопку «Добавить в заказ» на элементе управления.Это активирует следующий метод.

 private void btn_add_Click(object sender, EventArgs e)
 {
       if (Main.sessionInProgress == true)
       {
                OrderQty qty = new OrderQty(lbl_caseSize.Text.ToString(), lbl_wholesale.Text.ToString(), lbl_product.Text, lbl_volume.Text.ToString(), lbl_physical.Text, lbl_available.Text, lbl_oo.Text, lbl_inner.Text, lbl_pltQty.Text, lbl_repeat.Text);
                qty.StartPosition = FormStartPosition.CenterParent;
                DialogResult result = qty.ShowDialog();
                if (result == DialogResult.Yes)
                {
                    if (Main.roundCheck == true)
                    {
                        // MessageBox.Show(qty.qtyReturn.ToString());
                        qty.qtyReturn = autoRoundToCaseSize(qty.qtyReturn);
                        //MessageBox.Show(qty.qtyReturn.ToString());
                        Main.addToOrderFromPicture(lbl_product.Text.ToString(), qty.qtyReturn.ToString(), qty.priceReturn.ToString());
                    }
                    else
                    {
                        Main.addToOrderFromPicture(lbl_product.Text.ToString(), qty.qtyReturn.ToString(), qty.priceReturn.ToString());
                    }
                    btn_add.Text = "X";
                    btn_add.BackColor = Color.FromArgb(236, 112, 99);
                }
            } 
  }

Причина, по которой основная функция является статической, заключается в том, что я могу вызывать ее из этого метода.В Swift я бы использовал делегат для передачи данных между формами и т. Д. Однако я не уверен, как это сделать в C #.

Существует ли такой же способ передачи данных между формами, как в Swift.Как мне это сделать?Или есть способ для меня вызвать метод в Main без необходимости, чтобы он был статическим.

РЕДАКТИРОВАТЬ: Я не думаю, что я объяснил формы и т. Д. Очень хорошо, поэтому постараюсь очистить его,

Метод addToOrderFromPicture содержится в Main.Эта функция добавляет товары в список заказов, который также является статическим и содержится в Main.

Метод 'btn_add_Click' содержится в Product.cs, который является UserControl.Этот пользовательский элемент управления отображается на flowPanel, который находится в главной форме.

Таким образом, пользователь щелкает, активирует функцию в Product.cs, это создает экземпляр OrderQty.cs, который возвращает количество в Product.cs.- Из Product.cs вызывается метод addToOrder в Main, и ему передаются такие данные, как qty и т. Д.

So Product.cs -> OrderQty.cs -> Product.cs -> Main.cs

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Может быть, вы можете хранить свою логику в отдельном классе вместо Main.

public class Service
    {
        public List<Product> Order { get; set; }

        public void addToOrderFromPicture(string product, string qty, string _price)
        {
            Order.Add(product);
        }
    }
0 голосов
/ 27 ноября 2018

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

0 голосов
/ 27 ноября 2018

Ваша форма по-прежнему доступна после того, как вы позвонили this.Close() и ShowDialog вернулись, поэтому вы можете сделать это:

            OrderQty qty = new OrderQty(lbl_caseSize.Text.ToString(), lbl_wholesale.Text.ToString(), lbl_product.Text, lbl_volume.Text.ToString(), lbl_physical.Text, lbl_available.Text, lbl_oo.Text, lbl_inner.Text, lbl_pltQty.Text, lbl_repeat.Text);
            qty.StartPosition = FormStartPosition.CenterParent;
            DialogResult result = qty.ShowDialog();
            if (result == DialogResult.Yes)
            {
                qty.addToOrderFromPicture(lbl_product.Text.ToString(), qty.qtyReturn.ToString(), qty.priceReturn.ToString());
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...