Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 把一个事件称为另一种形式最优雅的方式是什么?_C#_Winforms - Fatal编程技术网

C# 把一个事件称为另一种形式最优雅的方式是什么?

C# 把一个事件称为另一种形式最优雅的方式是什么?,c#,winforms,C#,Winforms,假设我有一个名为Form1的表单,它会以某种方式调用另一个表单Form2 (表格一) 此表单2有一个按钮,用户每次单击此按钮时,该按钮都会执行一些操作 但是,我希望在第一次,即刚显示Form2时,按钮中的代码(某些操作)得到执行 换句话说,我必须能够调用Form2的按钮中的代码,单击该按钮是私有的 现在我可以想出一些方法来实现这一点(公开点击事件等),但我的问题是,最优雅(或正确)的方法是什么?最简单的方法就是公开,但这不是伟大设计的堡垒 解耦消息传递可能是您想要的地方,或者任何发布子方法消息传

假设我有一个名为
Form1
的表单,它会以某种方式调用另一个表单
Form2

(表格一)

表单2
有一个按钮,用户每次单击此按钮时,该按钮都会执行一些操作

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

换句话说,我必须能够调用Form2的
按钮中的代码,单击该按钮是私有的


现在我可以想出一些方法来实现这一点(公开点击事件等),但我的问题是,最优雅(或正确)的方法是什么?

最简单的方法就是公开,但这不是伟大设计的堡垒

解耦消息传递可能是您想要的地方,或者任何发布子方法消息传递系统。这是一种更现代、更具可扩展性的方法,参与者无需相互了解,从而允许您将方法私有化,并为您提供更易于维护的解决方案,并保持类的自一致性

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));
}
public Form1()
{
初始化组件();
EventPublisher.Instance.Subscribe
(n=>listBoxUsers.Items.Add(n.User.Name));
}
...
//另一类
私人表格2()
{
var user=新用户()
{
Name=textBoxUserName.Text,
Password=textBoxPassword.Text,
Email=textBoxEmail.Text
};
EventPublisher.Instance.Publish(NewUserRequested(user));
}

最简单的方法就是将其公开,但这并不是伟大设计的堡垒

解耦消息传递可能是您想要的地方,或者任何发布子方法消息传递系统。这是一种更现代、更具可扩展性的方法,参与者无需相互了解,从而允许您将方法私有化,并为您提供更易于维护的解决方案,并保持类的自一致性

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));
}
public Form1()
{
初始化组件();
EventPublisher.Instance.Subscribe
(n=>listBoxUsers.Items.Add(n.User.Name));
}
...
//另一类
私人表格2()
{
var user=新用户()
{
Name=textBoxUserName.Text,
Password=textBoxPassword.Text,
Email=textBoxEmail.Text
};
EventPublisher.Instance.Publish(NewUserRequested(user));
}

我会在
Form2
中添加一个属性,告诉表单我想自动执行一个操作

class Form2
{
    public bool AutoExecuteSomeOperation { get; set; }
}
Form1
中,您将设置该属性,在
Form2
中,如果设置了该属性,您将检查并执行适当的代码

我建议您重构
按钮\u单击
调用另一个方法,您也可以调用该方法来自动执行。我希望事件处理程序保持简单,并且只针对用于命名事件处理程序的控件上的事件执行。因此,您知道,
button\u Click
是名为
button
的控件上的
Click
事件的处理程序。它使代码更易于维护

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


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

我会在
Form2
中添加一个属性,告诉表单我希望自动执行一个操作

class Form2
{
    public bool AutoExecuteSomeOperation { get; set; }
}
Form1
中,您将设置该属性,在
Form2
中,如果设置了该属性,您将检查并执行适当的代码

我建议您重构
按钮\u单击
调用另一个方法,您也可以调用该方法来自动执行。我希望事件处理程序保持简单,并且只针对用于命名事件处理程序的控件上的事件执行。因此,您知道,
button\u Click
是名为
button
的控件上的
Click
事件的处理程序。它使代码更易于维护

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


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

将代码从OnClick事件移动到自己的me中
public partial class demoForm : Form {
        public demoForm() {
            InitializeComponent();
            DoWork();
        }

        private void button1_Click(object sender, EventArgs e) {
            DoWork();
        }
        public void DoWork() {
            //Code here
        }
    }