调用另一个表单的事件的最优雅方法是什么?

时间:2018-10-23 01:14:43

标签: c# winforms

假设我有一个名为compute_gradients()的表格,它将以某种方式(不相关)调用另一种表格Form1

(Form1)

Form2

Form2 f2= new Form2(); f2.ShowDialog(); 具有一个按钮,该按钮每次用户单击该按钮都会执行一些操作

但是,我希望第一次 ,即刚显示Form2时,按钮(一些操作)中的代码将被执行。

换句话说,我必须能够在Form2的Form2中调用私有的代码。

现在,我可以想到一些方法来实现此目的(将click事件公开等),但是我的问题是,最优雅(或最正确)的方法是什么?

3 个答案:

答案 0 :(得分:2)

我会向#include<iostream> #include<cmath> using namespace std; int fast_exponentiation(int base, int pow) { unsigned int result; // variable to store intermediaries if (pow == 1) { return base; } else if (pow == 0) { return 1; } result = fast_exponentiation(base, floor(pow/2)); // even power if (pow % 2 == 0) { return result * result; } // odd power else { return result * base * result; } } int main() { int num, answer, p; cout << "Enter the base: "; cin >> num; cout << "Enter power: "; cin >> p; answer = fast_exponentiation(num, p); cout << answer << endl; return 0; } 添加一个属性,以告知我喜欢自动执行动作的表单。

Form2

class Form2 { public bool AutoExecuteSomeOperation { get; set; } } 中,您将设置该属性;在Form1中,您将检查并执行相应的代码(如果已设置)。

我建议您重构Form2来调用另一个方法,您也可以调用该方法来自动执行。我喜欢使事件处理程序保持简单,并且仅对用于命名事件处理程序的控件上的事件执行。因此,您知道button_Click是名为button_Click的控件上Click事件的处理程序。它使代码更易于维护。

您可以决定在执行代码后是否要重置属性,或者可以添加一些验证以确认属性更改是有效的。例如,您可能需要确保在显示表单之前调用该属性。

在所有情况下,都应避免从外部形式引用任何控件。只有button本身应该知道它包含一个按钮。来自外界的任何使用都应通过公共财产或此类形式的公共活动来进行。这样,如果您决定应将按钮替换为超链接,则不需要更新菜单项,复选框或其他Form1。这与Form1的操作非常相似。内部细节泄漏越少,无需更新所有呼叫者就越容易进行内部更改。

答案 1 :(得分:1)

最简单的方法就是将其公开,但是它并不是出色设计的堡垒。

event aggregator或任何pub子方法消息传递系统都可能是去耦消息传递。这是一种更现代且可扩展的方法,参与者不需要彼此了解,可以让您将方法设置为私有,并为您提供更易于维护的decoupled解决方案,并使您的类保持一致。

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));
}

答案 2 :(得分:1)

将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
        }
    }