【问题标题】:Validation of c# winform controls that are bounded to an object验证绑定到对象的 c# winform 控件
【发布时间】:2017-02-23 09:46:42
【问题描述】:

我使用工具箱在我的应用程序中创建了 winform 控件。我还在设置页面中设置了这些控件的默认值、最小值和最大值。然后,我将这些控件限制在一个对象中。看起来像这样的东西:

 private void InitializeBinding()
    {
        enable_checkbox.DataBindings.Add("Checked", ObjectConfig, "enable");
        area_numeric.DataBindings.Add("Value", ObjectConfig, "area");

    }

我的 ObjectConfig 类有这个:

class ObjectConfig {
   private bool bEnable;
   private int iArea;

   public bool enable
   {
     get { return bEnable; }
     set { bEnable = value; }
   }

   public int area
   {
     get { return iArea; }
     set { iArea = value; }
   }
}

绑定效果很好。没有任何问题。然后,我将此对象转换为 xml,并将其保存到配置 xml 文件中。问题是,如果有人将 xml 文件中的区域值编辑为超出设置的最小值和最大值以及 xml 的数字加载并转换为对象时,由于对象绑定到具有最小值和最大值的控件,因此出现错误。有没有在这种方法中提供验证的好方法?

【问题讨论】:

  • 最小和最大值是硬编码的吗?或者你从哪里得到它们?
  • 最小值和最大值在控件的设置下设置。

标签: c# .net winforms controls


【解决方案1】:

您可以在属性的设置器中对其进行约束,并在那里检查它是否在限制范围内。您可以像这样将限制值放入项目属性变量中(对不起德语版Dictionary):

在设置器中,您可以检查这些范围并访问变量,如下所示:

public class ObjectConfig
{
    private bool bEnable;
    private int iArea;

    public bool enable
    {
        get { return bEnable; }
        set { bEnable = value; }
    }

    public int area
    {
        get { return iArea; }
        set
        {
            if (value < Properties.Settings.Default.AreaMin)
            {
                iArea = Properties.Settings.Default.AreaMin;
            }
            else if (value > Properties.Settings.Default.AreaMax)
            {
                iArea = Properties.Settings.Default.AreaMax;
            }
            else
            {
                iArea = value;
            }
        }
    }
}

这样,无论用户在 *.XML 文件中编辑什么,您的值都将始终在设定范围内。

【讨论】:

  • 感谢您的回答。这肯定是可能的。但是,在未来,ObjectConfig 的属性有可能会达到 10 多个左右。我不想尽可能硬编码每个属性的所有 10 最小值和最大值。没有其他办法了吗?
  • @Redis1001 我并没有真正关注最小值和最大值是如何实现的。我回答了您对验证方法的要求。这是您可以避免将不允许的值分配给属性的方法。您的最小值和最大值的管理取决于您。 :)
  • @Redis1001 如果最小值和最大值是在“控件设置下”设置的,为什么不直接使用这些值?
  • 我确实想使用设置中设置的最小值和最大值,但我必须在设置器中使用它,因为我使用 XMLSerializer 将数据直接从 XML 转换为对象。跨度>
  • @Redis1001 我编辑了我的答案。现在您可以将限制值保存在属性设置中并使用设置器中的变量。看看
猜你喜欢
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多