winforms 如何创建一个独立的类来检测全局整数是否为某个数字,然后覆盖窗体中的label.text?

mpgws1up  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(133)

我想创建一个全局类(所以我只需要写一次,而不是所有的形式),它应该检测全局int是否是某个数字,然后覆盖标签中的文本,说明错误。
例如,当你的名字太短,它会说,你的名字太短。我知道你可以这样做的形式,但我希望整个新的分离类,因为我计划这样做的3个形式,所以我将不得不复制和粘贴相同的错误等...在每一个。
示例:register_menu. cs格式的代码

public void getErrorNumber()
        {
          if (char_amount_username < 3 || textBox_username.Text == "Username")
            {
                Variables.error_number = 1;
            }
            else if (email_adress.Contains("@") != true || textBox_emailadress.Text == "Email adress")
            {
                Variables.error_number = 2;
            }
            else if (char_amount_password < 7 || textBox_password.Text == "Password")
            {
                Variables.error_number = 3;
            }
            else if (textBox_password.Text != textBox_passwordconfirm.Text)
            {
                Variables.error_number = 4;
            }
            else
            {
                Variables.error_number = 0;
            }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            ErrorCheck();
            
        }

名为GlobalErrorChecker.cs的类中的代码

namespace Xenious
{
     internal class ErrorVariable
    {
        public static int error_number;
        public void ErrorCheck()
             getErrorNumber();
        {
            if (ErrorVariable.error_number is 1) ;
        {
            register_menu.error_msg.Text = "Your username is invalid!\n  ⬤ Username must be avaiable\n  ⬤ Minimum lenght of username is 4 ";
            register_menu.displayERROR(true);
        }
        if(ErrorVariable.error_number is 2);
        {
            register_menu.error_message.Visible = true;
            register_menu.error_msg.Text = "Your password is invalid!\n  ⬤ Minimum lenght of password is 8 ";
            register_menu.ICON_password_error.Visible = true;
        }
        if (ErrorVariable.error_number is 6) ;
        {
            login_menu.error_message.Visible = true;
            login_menu.error_msg.Text = "Your username and password do not match!";
            login_menu.ICON_username_error.Visible = true;
            login_menu.ICON_password_error.Visible = true;
        }
     }
    }
}

这只是我想如何做的示例代码,我有多个问题。第一个问题是类GlobalErrorChecker.cs根本没有检测到表单中的任何控件。我试图通过在线查找来修复这个问题,但我可以找到任何东西。第二个问题是它说register_menu.ICON_password_error由于保护错误CS0122而不可用...
我尝试了大量不同的方法来实现这个功能,但是我只找到了在两个不同的窗体之间实现这个功能的方法,而没有找到在窗体和新类之间实现这个功能的方法

1tuwyuhd

1tuwyuhd1#

考虑使用FluentValidation之类的验证库。
首先创建一个具有要验证的属性的类,例如

public class Person
{
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
    public string Password { get; set; }
    public string PasswordConfirmation { get; set; }
}

创建一个validator

public class PersonValidator : AbstractValidator<Person>
{
    public PersonValidator()
    {
        RuleFor(person => person.UserName)
            .NotEmpty()
            .MinimumLength(3);

        RuleFor(person => person.EmailAddress).EmailAddress();
        RuleFor(person => person.Password.Length).GreaterThan( 7);
        RuleFor(person => person.Password).Equal(p => p.PasswordConfirmation);

    }
}

创建类的新示例,在本例中为Person。从控件填充值,然后通过Validate执行验证。
下面是一个模型,它使用StringBuilder创建一个可以呈现给用户的字符串。

Person person = new Person()
{
    UserName = "billyBob",
    Password = "my@Password1", 
    EmailAddress = "billyBob@gmailcom", 
    PasswordConfirmation = "my@Password1"
};

PersonValidator validator = new PersonValidator();
ValidationResult result = validator.Validate(person);
if (result.IsValid)
{
    // person is valid
}
else
{
    StringBuilder builder = new StringBuilder();
    foreach (var error in result.Errors)
    {
        builder.AppendLine(error.ErrorMessage);
    }
}

如果需要检查个别错误,如PropertyName(要验证的属性的名称)和ComparisonValue(属性不应等于的值),请深入研究ValidationResult。

注意电子邮件地址验证程序只检查电子邮件地址是否有@,因此如果您需要更多的自定义工作。

jhdbpxl9

jhdbpxl92#

创建静态Extension Method是**“创建全局类(所以我只需要写一次......)"**的一种方法。

首先询问“确定有效表单需要哪些信息?”在interface中定义这些要求:

interface IValidate
{
    // Inputs needed
    public string Username { get; }
    public string Email { get; }
    public string Password { get; }
    public string Confirm { get; }
}

现在为实现IValidate的“any”表单声明一个扩展方法(这是您所询问的全局类)。

static class Extensions
{
    public static int ValidateForm(this IValidate @this, CancelEventArgs e)
    {
        if (@this.Username.Length < 3) return 1;
        if (!@this.Email.Contains("@")) return 2;
        if (@this.Password.Length < 7) return 3;
        if (!@this.Password.Equals(@this.Confirm)) return 4;
        return 0;
    }
}

Form类将能够使用this调用扩展。

var e = new new CancelEventArgs();
int error_number = this.ValidateForm(e);

表单验证示例

对于3个表单中的每一个,实现接口,这意味着3个表单类承诺或约定提供接口所需的信息(在本例中,通过从文本框中检索文本)。

public partial class MainForm : Form, IValidate
{
    #region I M P L E M E N T    I N T E R F A C E
    public string Username => textBoxUsername.Text;
    public string Email => textBoxEmail.Text;
    public string Password => textBoxPassword.Text;
    public string Confirm => textBoxConfirm.Text;
    #endregion I M P L E M E N T    I N T E R F A C E
    .
    .
    .
}

然后在任何文本框失去焦点或接收到Enter键时调用扩展方法。

public partial class MainForm : Form, IValidate
{        
    public MainForm()
    {
        InitializeComponent();
        foreach (Control control in Controls)
        {
            if(control is TextBox textBox)
            {
                textBox.TabStop = false;
                textBox.KeyDown += onAnyTextboxKeyDown;
                textBox.Validating += onAnyTextBoxValidating;
                textBox.TextChanged += (sender, e) =>
                {
                    if (sender is TextBox textbox) textbox.Modified = true;
                };
            }
        }
    }
    private void onAnyTextBoxValidating(object? sender, CancelEventArgs e)
    {
        if (sender is TextBox textBox)
        {
            // Call the extension method to validate.
            ErrorInt @int = (ErrorInt)this.ValidateForm(e);
            if (@int.Equals(ErrorInt.None))
            {
                labelError.Visible = false;
                buttonLogin.Enabled = true;
                return;
            }
            else if (textBox.Modified)
            {
                buttonLogin.Enabled = false;
                BeginInvoke(() =>
                {
                    switch (@int)
                    {
                        case ErrorInt.Username: textBoxUsername.Focus(); break;
                        case ErrorInt.Email: textBoxEmail.Focus(); break;
                        case ErrorInt.Password: textBoxPassword.Focus(); break;
                        case ErrorInt.Confirm: textBoxConfirm.Focus(); break;
                    }
                    labelError.Visible = true;
                    labelError.Text = typeof(ErrorInt)
                        .GetMember(@int.ToString())
                        .First()?
                        .GetCustomAttribute<DescriptionAttribute>()
                        .Description;
                    textBox.Modified = false;
                    textBox.SelectAll();
                });
            }
        }
    }
    private void onAnyTextboxKeyDown(object? sender, KeyEventArgs e)
    {
        if (sender is TextBox textbox)
        {
            if (e.KeyData.Equals(Keys.Return))
            {
                // Handle the Enter key.
                e.SuppressKeyPress = e.Handled = true;

                MethodInfo? validate = typeof(TextBox).GetMethod("OnValidating", BindingFlags.Instance | BindingFlags.NonPublic);
                CancelEventArgs eCancel = new CancelEventArgs();
                validate?.Invoke(textbox, new[] { eCancel });
            }
        }
    }
    .
    .
    .
}

其中:

enum ErrorInt
{
    None = 0,
    [Description("Username must be at least 3 characters.")]
    Username = 1,
    [Description("Valid email is required.")]
    Email = 2,
    [Description("Password must be at least 7 characters.")]
    Password = 3,
    [Description("Passwords must match.")]
    Confirm = 4,
}

相关问题