вызывающая функция нажатия кнопки из другого класса - PullRequest
0 голосов
/ 10 января 2019

В настоящее время у меня есть одна форма и несколько пользовательских элементов управления, у меня установлена ​​панель из основной панели Form1, поэтому при каждом нажатии кнопки один из пользовательских элементов управления будет отображаться на главной панели.

Моя проблема в том, что один из элементов управления (InfoSetting) имеет некоторые другие новые кнопки, и когда я нажимаю на них, я бы хотел, чтобы mainPanel показывал новый пользовательский элемент управления. Тем не менее, сейчас все остальные кнопки из Form1 работают нормально, но когда я нажимаю кнопку InfoSetting, кажется, ничего не появляется.

вот мой код от Form1

public partial class Form1 : MetroFramework.Forms.MetroForm
{
    InfoSettings infoSetting;
    CashSales cashSales; 
    PriceSetting priceSetting; 
    public Form1()
    {
        InitializeComponent();
        infoSetting  = new InfoSettings();
        cashSales = new CashSales();
        priceSetting = new PriceSetting();
    }


    protected void ButtonClicked(object sender, EventArgs e)
    {

        buttonHandler(sender);
    }

    public void buttonHandler(object sender)
    {
        Button button = sender as Button;
        mainPanel.Controls.Clear();

        if (button != null)
        {
            switch (button.Name)
            {
                case "HomeBtn":
                    infoSetting.Dock = DockStyle.Fill;
                    mainPanel.Controls.Add(infoSetting);
                    break;

                case "cashSalesBtn":
                    cashSales.Dock = DockStyle.Fill;
                    mainPanel.Controls.Add(cashSales);
                    break;

                case "settingBtn":
                    infoSetting.Dock = DockStyle.Fill;
                    mainPanel.Controls.Add(infoSetting);
                    break;

                case "priceSettingBtn":
                    cashSales.Dock = DockStyle.Fill;
                    mainPanel.Controls.Add(cashSales);
                    break;

                default:
                    mainPanel.Controls.Clear();
                    break;
            }
        }
    }

и вот код из InfoSetting пользовательского элемента управления

public partial class InfoSettings : UserControl
{


    public InfoSettings()
    {
        InitializeComponent();
    }

    private void priceSettingBtn_Click(object sender, EventArgs e)
    {
        Form1 form1 = new Form1();
        form1.buttonHandler(sender);
    }
}

Ответы [ 4 ]

0 голосов
/ 10 января 2019

У меня будет глобальный объект с указателем на все формы в приложении.

public Global
{
     public Form1 MainForm;
     public Dialog1 D1;
...
}

public static Global = new Global();

В качестве каждой формы создается

Global.MainForm = form1;

тогда вы можете пойти

private void priceSettingBtn_Click(object sender, EventArgs e)
{

    Global.MainForm.buttonHandler(sender);
}

Как уже говорили, лучше не вызывать обработчик кликов, лучше иметь этот код, а настоящий обработчик кликов вызывает функцию уровня бизнес-логики

0 голосов
/ 10 января 2019

Вы можете сделать Форму 1 как «статическую», а также метод buttonHandler (отправитель объекта) также как «статическую».

Затем внутри priceSettingBtn_Click вызовите функцию ниже

Form1.buttonHandler (отправитель);

0 голосов
/ 10 января 2019

как stuartd сказал, что вы можете добавить вызов в родительскую форму:

public partial class InfoSettings : UserControl
{
    public InfoSettings()
    {
        InitializeComponent();
    }

    private void settingBtn_Click(object sender, EventArgs e)
    {
        Form1 form1 = (Form1) this.Parent;
        form1.buttonHandler(sender);
    }
}
0 голосов
/ 10 января 2019

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

    public class FormHelper
    {
        public void CodeIWantToRunIn2Places()
        {
           // Implementation Here
        }
    }

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

    FormHelper.Instance.CodeIWantToRunIn2Places();

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

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