2

我正在尝试对我们现有产品的一组相当复杂的技术应用一些验证,同时实现一个新架构。其中大部分进展顺利,但是我仍然需要对现有产品使用 WinForms,因此需要使用ErrorProvider该类来显示验证错误。(新产品也将能够通过 WPF/MVC 使用新架构,但我没有时间或资源从头开始完全重写以消除 WinForms,因此需要混合技术)

新架构的基本布局如下:

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

所以我的问题是,我如何利用对表单上模型属性ValidationResult的失败DataAnnotation检查中的一个?ErrorProvider

我已经设法获得了ValidationResults最多表单的列表,但是将它们设置为特定控件是在暗示我没有为每个控件编写代码,我更愿意通过BindingSource可能在基本表单中创建一个通用的方法来执行此操作。

我知道如果DataAnnotations在 ViewModels 上我可以更容易地做到这一点,但如果我这样做了,那么如果对 Model/Database 表进行了更改,我将不得不让所有这些都保持最新,这将需要大量的重复代码。

我知道这个问题有点含糊,但考虑到它跨越了大部分架构的事实,如果不编写大量几乎不相关的代码,我看不到更好的解释方式。如果您需要更多信息,请询问,我会提供。

非常感谢。

4

1 回答 1

1

不确定这是否有帮助,但看看是否将您的 btn_Save 更改为这样,然后添加 GetControlBoundToMember 方法,我猜您的 btnSave 方法类似于下面的方法。您还需要在表单中添加一个 ErrorProvider 控件并将其命名为 err1 并将可能位于 groupbox 中的任何控件移出 groupbo 并将它们放置到表单上,除非您创建一个递归方法来搜索具有控件的集合。

     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 回答