0

アプリケーションでいくつかのカスタムユーザーコントロールを作成しました。これらは、Validates()メソッドを使用して独自のコンテンツを検証するコントロールです。フォームのボタンをクリックすると、このメソッドを持つすべてのコントロールでこのメソッドを呼び出したいと思います。これを達成するための最良の方法は何ですか?

コントロールとコントロールを識別し、メソッドがあるかどうかを確認することはできますが、現時点ではどのように呼び出すかがわかりません。(すべてのコントロールは「cc」で始まります)

        foreach (Control c in this.Controls)
        {
            if (c.Name.Length > 2 && c.Name.Substring(0, 2).Equals("cc"))
            {
                var type = c.GetType();
                if (type.GetMethod("Validates") != null)
                {
                    // Call method here
                }
            }
        }

誰かが私を正しい方向に向けることができますか、またはおそらく私がこれを行うことができるより良い方法です。これらのコントロールは多くのフォームにあると思いますので、親フォームからグループ化された検証をできるだけ簡単にしたいと思います。

ありがとう、

4

3 に答える 3

1

おそらくインターフェイスを使用してみてください

public interface IValidateMyData
{
    bool Validate();
}

public class ValidationControl : Control, IValidateMyData
{
    // code here
    public bool Validate()
    {
        return true;
    }
}

フォームで上記のようにすべてのコントロールを繰り返しますが、名前を確認せずに、コントロールが IValidateMyData インターフェイスを実装しているかどうかを判断します。

foreach (Control c in this.Controls)
{
    if ( c is IValidateMyData )
    {
        var validationResult = (c as IValidateMyData).Validate();
    }
}

このメソッドを使用すると、コントロールは特定の名前のプレフィックスを持つようにバインドされません。

さらに、すべてのコントロールの反復をフォームが継承するベースクラスに移動し、フォームで「ValidateAllControls()」メソッドを呼び出すだけです。

于 2012-11-01T10:38:56.727 に答える
1

WinForms でこれを行う通常の方法は、フォーム検証イベントを使用することです。

于 2012-11-01T10:39:39.510 に答える
0

メソッドをinterface持つすべてのコントロールは、そのインターフェイスを実装する必要があります。Validate

public interface IValidatable
{
    void Validates();
}

ループ内のインターフェイスを確認します。

foreach (Control c in this.Controls)
{
  IValidatable validateControl = c as IValidatable;
  if(validateControl != null)
  {

       // do the validation.
       validateControl.Validates();
  }
于 2012-11-01T10:34:30.387 に答える