【问题标题】:C# UserControl Custom PropertiesC# 用户控件自定义属性
【发布时间】:2011-02-12 20:59:54
【问题描述】:

我正在创建一个用户控件,它为一系列文本框样式提供所有常见验证:alpha、数字、小数、SSN 等。因此,当使用此控件的开发人员选择 alpha 样式时,他们还可以选择另一个属性,它定义了在验证期间也可以允许的特殊字符字符串。

但是当比十进制样式被选中时,我想简单地禁用特殊字符属性,以便在选择的样式时无法设置,这不允许特殊字符。

我怎样才能实现这个目标?

谢谢

【问题讨论】:

  • 不确定它是如何工作的,但也许有些人可以解释如何“扩展”控件的属性,例如向每个活动控件添加属性的工具提示。我找不到一个很好的例子,但你可以使用这个模式来动态地向你的控件添加属性吗?

标签: c# user-controls properties


【解决方案1】:

您不能在 C# 中禁用属性 - 它们是类型接口的一部分,它保证调用者可以在编译时绑定到这些操作。

最简单的实现是当用户指定不兼容的样式时忽略特殊字符。这是惯用的 .NET 行为 - 例如,请参阅 CompareValidator,它具有一些互斥属性:

不要同时设置 ControlToCompare 和 ValueToCompare 属性 同时。你可以比较 输入控件的值 另一个输入控件,或 恒定值。如果两个属性都 设置,ControlToCompare 属性 优先。

话虽如此,这种技术使类比它们需要的更难使用——它们的接口并没有真正告诉你如何使用它们。我建议将您的验证器分为两类:一类用于字母验证,一类用于数字验证。

或者,当样式不支持特殊字符时,您可以在设置器中抛出异常。通常,这太过分了,但它会让客户端程序员清楚地知道他们做了一些无效的事情。

【讨论】:

    【解决方案2】:

    我会考虑在属性的设置器中这样做

    private string specialCharacters = "";
    public string SpecialCharacters
    {
       get { if ( usingDecimals ) 
               specialCharacters = "";
    
            return specialCharacters; }
    
       set { if( usingDecimals )
                value = "";
    
             specialCharacters = value; }
    }
    
    private boolean usingDecimals = false;
    public boolean UsingDecimals
    {  get { return usingDecimals; } 
       set { usingDecimals = value;
             if( usingDecimals )
                 specialCharacters = ""; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多