0

いくつかのテキスト ボックスとコンボ ボックスを含むフォームがあり、フォームの [OK] ボタンを有効にする前に、これらのコントロールに入力する必要があるとします。

したがって、1 つの方法は、必要なコンボボックスとテキスト ボックスが入力されているかどうかを確認する EnableOK() メソッドのような集中型のメソッドを用意することです...そして、これらの必要なコントロールの TextChanged または IndexChanged イベントで、この EnableOK( を呼び出す必要があります。 ) 方法。

それで、これを行うより良い方法があるかどうか考えていましたか?多分私たちが使用できるパターンがありますか?すべての場所で EnableOk() を呼び出す必要がないように、またはおそらくより良い方法はなく、他のすべてのボディがそれを行っている方法ですか?

PS: C# Winforms を使用しています。

4

3 に答える 3

2

1 つの方法は、[OK] ボタンをまったく無効にしないことです。代わりに、ユーザーが [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.
     }
}

必要なデータがすべて入力されるまで待機します。次に、[OK] ボタンが有効になります。


使用して

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 に答える