【问题标题】:How to call a method in all Load events of forms without repeating code? [closed]如何在不重复代码的情况下在表单的所有 Load 事件中调用方法? [关闭]
【发布时间】:2020-07-03 19:37:55
【问题描述】:

我想在所有加载事件表单中调用验证函数,但我想避免将代码放在加载事件中(这个项目有 50 多个表单)。 有没有办法做到这一点?

private void frmPrincipal_Load(object sender, EventArgs e) 
{    
    //i want to avoid this code in all forms
    if ( validation() == false )
        System.Windows.Forms.Application.Exit()    
}

【问题讨论】:

  • 是的,你说得对,我想在加载事件开始时执行验证功能,但我不想以所有形式编写此代码块(它会生成 dity 代码),所以我想知道是否有一种方法可以在加载事件中避免它。

标签: c# .net winforms refactoring generalization


【解决方案1】:

例如,您可以创建一个名为 ValidatedForm 的专用表单。

在您的 VS 项目中添加一个新的空类并添加您需要的所有内容:

using System;
using System.Windows.Forms;

namespace SomeNamespace
{

  public class ValidatedForm : Form
  {

    public ValidatedForm()
      : base()
    {
    }

    protected override void OnLoad(EventArgs e)
    {
      base.OnLoad(e);
      if ( !validation() )
        Application.Exit();
    }

  }

}

接下来将 Form 的祖先更改为 ValidatedForm 以获得您想要的所有形式:

public partial class SomeForm : ValidatedForm

现在它们都继承了新的行为。

但请注意,在设计时验证方法可能会关闭 VS,因此如果您在设计时可能需要签入。

How to check if i'm in run-time or design time?

【讨论】:

    【解决方案2】:

    因此,您有一些代码需要在加载任何表单时执行。可以在全局类中创建静态方法(我一般使用静态类):

    public static class Engine
    {
        public static void anyForm_Load(object sender, EventArgs e)
        {
            if (validation() == false)
                System.Windows.Forms.Application.Exit();
        }
    }
    

    然后,在您的每个表单中,在构造函数中,添加这一行,它知道当该表单加载时,它将执行该方法中的任何内容:

        public Form1()
        {
            InitializeComponent();
            this.Load += Engine.anyForm_Load;
        }
    

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多