Какой самый элегантный способ назвать событие другой формы? - PullRequest
0 голосов
/ 23 октября 2018

Допустим, у меня есть форма с именем Form1, которая каким-то образом (как не актуально) вызывает другую форму Form2

(Form1)

Form2 f2= new Form2();
f2.ShowDialog();

This Form2имеет кнопку, которая будет выполнять некоторые операции каждый раз, когда пользователь нажимает на эту кнопку.

Тем не менее, я хочу, чтобы в первый раз , т.е. когда только что была показана Form2, выполнялся код в кнопке ( некоторая операция ).

Другими словами, я должен иметь возможность вызывать код в button_Click формы 2, который является приватным.

Теперь я могу придумать несколько способов сделать это возможным (сделать событие click общедоступным).и т. д.), но мой вопрос: какой самый элегантный (или правильный) способ сделать это?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Я бы добавил свойство к Form2, чтобы сообщить форме, которая мне нравится, для автоматического выполнения действия.

class Form2
{
    public bool AutoExecuteSomeOperation { get; set; }
}

В Form1 вы бы задали это свойство, а в Form2 вы быпроверьте и выполните соответствующий код, если свойство установлено.

Я бы порекомендовал вам выполнить рефакторинг button_Click для вызова другого метода, который вы также можете вызвать для автоматического выполнения.Мне нравится, чтобы обработчик событий был простым и выполнялся только для события в элементе управления, который служил для имени обработчика события.Таким образом, вы знаете, что button_Click является обработчиком для события Click в элементе управления с именем button.Это облегчает поддержку кода.

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

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

0 голосов
/ 23 октября 2018

Переместите код из события OnClick в его собственный метод (например, «DoWork»), затем вызовите этот метод из события OnClick.

Либо вызовите его при создании формы

var frm = new demoForm();
frm.DoWork();
frm.Show();

Или вызвать его в конструкторе форм.

public partial class demoForm : Form {
        public demoForm() {
            InitializeComponent();
            DoWork();
        }

        private void button1_Click(object sender, EventArgs e) {
            DoWork();
        }
        public void DoWork() {
            //Code here
        }
    }
0 голосов
/ 23 октября 2018

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

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

Unity , MvvmLight имеют оба вида систем обмена сообщениями, однако их много.

Пример того, как это можетработа

public Form1()
{
    InitializeComponent();
    EventPublisher.Instance.Subscribe<NewUserCreated>
        (n => listBoxUsers.Items.Add(n.User.Name));
}

...

// some other class
private void Form2()
{

    var user = new User()
               {
                   Name = textBoxUserName.Text,
                   Password = textBoxPassword.Text,
                   Email = textBoxEmail.Text
               };
    EventPublisher.Instance.Publish(new NewUserRequested(user));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...