0

假设我有一个带有一些文本框和组合框的表单,其中一些是必须填写的控件,然后才能启用表单上的 OK 按钮。

因此,一种方法是使用像 EnableOK() 方法这样的集中式方法来检查那些所需的组合框和文本框是否已填写...然后我必须继续这些所需控件的 TextChanged 或 IndexChanged 事件调用此 EnableOK( ) 方法。

所以我在想是否有更好的方法来做到这一点?也许我们可以使用一种模式?这样我就不必在每个地方都调用 EnableOk(),或者也许没有更好的方法,而这就是其他人都在这样做的方式?

PS:我正在使用 C# Winforms。

4

3 回答 3

2

一种方法是根本不禁用“确定”按钮。相反,当用户按下 OK 时,请检查并在出现问题时显示 MessageBox。

我喜欢这种方法有几个原因。

  1. 用户永远不会想知道为什么没有启用 OK 按钮。
  2. 您可以准确地告诉用户为什么不能继续。你可以告诉他们他们“搞砸了”的地方。

我个人更喜欢这种方法。用户不应该决定什么是可接受的输入。我更喜欢通过告诉他们在输入错误时需要在哪里修改输入来简单地轻推用户。

于 2012-09-19T14:46:40.410 回答
1

创建一个观察者,它将订阅所有 textBox.TextChanged 事件。

public class IputValidator
{ 
     public event Action ValidationDone;
     private List<TextBox> boxes = new List<TextBox>();
     public void RegisterTextBox(TextBox tb) 
     { 
       tb.TextChanged += (s,e) => Validate;
       boxes.Add(tb);
     }
     public void Validate() 
     { 
        foreach(var t in boxes)
        {
          if(string.IsNullOrEmpty(t.Text)) return;
        }
        //all data inputed. fire validationDone event.
     }
}

它将等待输入所有必要的数据。然后,它将启用确定按钮。


使用

public partial class YourForm : Form 

{
  private InputValidator _validator;

  public YourForm() 
  {
     InitializeComponents(); //I don't remember the right name in WinForms
     _validator = new InputValidator();
     _validator.RegisterTextBox(_textBox1);
     _validator.ValidatonDone += () => { _okButton.Enable = true;} 
  }

}
于 2012-09-19T14:46:21.807 回答
1

这是使您能够在控制端进行一些复杂验证的架构方法:

  1. 创建一个对所有控件类型都通用的接口,例如:
interface iMyControls
{
    bool ValidateControl();
}
  1. 创建您自己的类,这些类继承自所需的控件并实现 iMyControls:

    internal class MyTextBox : System.Windows.Forms.TextBox, iMyControls
    {
         public bool ValidateControl()
         {
             return this.Text != "";
         }
    }
    
  2. 在您的表单上,只需查看此控件并调用:

    bool isValid = myControl.ValidateControl();
    
于 2012-09-19T14:58:55.663 回答