0

WinFormsアプリと複数のフォームがありErrorProvider、それぞれにコンポーネントを使用したい編集:ユーザー入力がOKかどうかを確認する(たとえば、入力した数値が範囲内にあるかどうかなど)このコンポーネントをにドロップするのは役に立たないようですありとあらゆる形。1つのグローバルオブジェクト(またはそれを呼び出す方法)を作成し、それをすべてのフォームで使用するとどうなりますか?

私の考え:

namespace MyApplication {  
static class Program {  

public static ErrorProvider EP = new ErrorProvider();
...

そして、その個別の形式で処理Validatingし、Validatedイベントを実行します。

private void txtBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
  if (txtBox1.Text != "correct text") {
    e.Cancel = true;
    Program.EP.SetError(txtBox1, "You have error in your input");
...

これは正しいアプローチですか、それとも他の方法で行う必要がありますか?

さらにグローバルオブジェクトが必要な場合は、それらをすべて個別の静的クラスにまとめて、Programこれだけを作成する必要があります(?)
ありがとうございます。

4

3 に答える 3

1

このアプローチは、個々のフォームが同時に実行されないか、エラープロバイダーが再入可能であり、エラープロバイダーがフォームへの永続的なリンクを必要としない限り有効です。示した例から、プロバイダーはエラー状態を設定するための制御を渡す必要があるように見えるため、再入可能になる可能性が高くなります。

于 2012-04-11T10:43:54.457 に答える
1

グローバルオブジェクトがあっても構いませんが、可能であれば静的なステートレスクラスにしたいです。ステートレスにより、スレッドセーフが容易になります。.NET全体で、グローバル(名前空間内)の静的クラス(または。)を持つのが一般的FileInfoですConvert

いくつかのグローバルメソッドのみが必要であり、それらがUI要素で動作する場合は、必要なコントロールがそれだけである場合System.Windows.Controls.Controlでも、いくつかの拡張メソッドを作成することもできます。System.Windows.Controls.TextBoxこれにより、少し優れたコードが得られます。

txtBox1.Validate("correct text", "You have error in your input");

拡張メソッドは次のようになります。

public static class MyExtension
{
    public static void Validate(this TextBox myTextBox, string correctText, string error)
    {
        if(myTextBox.Text != correctText)
            Console.WriteLine(string.Format("{0} [{1} == '{2}']", error, myTextBox.Name, myTextBox.Text));
    }
}

これにより、コンソールに次のメッセージが表示されます。

You have error in your input [txtBox1 == 'some text']

詳細が必要な場合は、拡張メソッドのドキュメントを参照してください。

于 2012-04-11T11:30:43.420 に答える
0

テキストボックスクラスを継承する新しいクラスを作成し、そこに検証を追加してから、クラスである新しいコントロールを作成し、必要な場所で使用できると思います。この場合、後で検証を1か所で編集/変更します。 。

検証が大きく異なる場合は、たとえばNumericTextBoxとStringTextBoxの2つのクラスを作成します。

于 2012-04-11T10:46:51.047 に答える