2

新しいアーキテクチャを実装しながら、既存の製品のかなり複雑な一連のテクノロジに検証を適用しようとしています。これのほとんどは順調に進んでいますが、既存の製品にはまだ WinForms を使用する必要があるため、ErrorProvider検証エラーを表示するためにクラスを使用する必要があります。(新製品は WPF/MVC 経由でも新しいアーキテクチャを使用できるようになりますが、現時点では WinForms を排除するためにゼロから完全に書き直すための時間やリソースがありません。そのため、テクノロジが混在しています)

新しいアーキテクチャの基本的なレイアウトは次のとおりです。

Database -> Model (via NHibernate) -> ViewModel -> Form (using BindingSource)

だから私の質問は、フォーム上のモデルのプロパティのValidationResult失敗したチェックからどのように利用できますか?DataAnnotationErrorProvider

フォームまでのリストを取得できましたが、ValidationResultsそれらを特定のコントロールに設定すると、各コントロールのコードを記述せずに私をほのめかしていBindingSourceます。おそらくベースフォームで、を介してこれを行う一般的な方法を作成することをお勧めします。

ViewModel にあればもっと簡単にできることはわかっていますDataAnnotationsが、そうすると、Model/Database テーブルに変更が加えられた場合にすべてを最新の状態に保つ必要があり、それには十分な量が必要になります。繰り返されるコードの。

この質問が少し漠然としていることは理解していますが、これがアーキテクチャの大部分にまたがっているという事実を考えると、ほとんど無関係なコードの連なりを書かずにそれを説明するより良い方法がわかりません。追加情報が必要な場合は、お問い合わせください。提供いたします。

どうもありがとう。

4

1 に答える 1

1

これが役立つかどうかはわかりませんが、btn_Save をこのように変更してから、GetControlBoundToMember メソッドも追加するかどうかを確認してください。btnSave メソッドは以下のように見えると思います。また、ErrorProvider コントロールをフォームに追加して err1 と呼び、グループボックスにある可能性のあるコントロールをグループボから移動してフォームに配置する必要があります。コントロールの収集。

     private void btnSave_Click(object sender, EventArgs e)
    {
        if (_entity != null)
        {
            try
            {
                _service.Save(_entity.UpdateEntity());
            }
            catch (InvalidOperationException ex)
            {
                //do something here to display errors
                listBox1.Items.Clear();
                foreach (var r in _entity.Errors)
                {
                    listBox1.Items.Add(r.ErrorMessage);

                    foreach (var c in GetControlBoundToMember(r.MemberNames.ToList()))
                    {
                        err1.SetError(c, r.ErrorMessage);
                    }
                }
            }
        }
    }


    private IList<Control> GetControlBoundToMember(IList<string> memberNames)
    {

        List<Control> controls = new List<Control>();

        foreach (Control control in this.Controls)
        {
            foreach (var mn in memberNames)
            {
                foreach (Binding binding in control.DataBindings)
                {
                    if (binding.BindingMemberInfo.BindingField == mn) controls.Add(control);
                }
            }
        }

        return controls;
    }

AB

于 2013-10-05T18:00:45.467 に答える