2012-04-20 83 views
2

我已通过重写TextBox组件实现自定义控件。它有一个名为“DbColumn”的自定义属性。我希望它能像TextBox上的“Name”属性那样工作,它是一个Form不能在两个控件上具有相同“DbColumn”值的组件。自定义组件属性具有唯一值

有没有一种方法来设置属性在一个窗体中具有唯一值?

回答

0

如果运行时检查是够你尝试实现System.ComponentModel.ISupportInitialize和检查逻辑添加到EndInit()

public class MyTextBox : TextBox, ISupportInitialize 
{ 
    ... 
    public string DbColumn { get; set; } 

    public void BeginInit() { } 
    public void EndInit() 
    { 
     bool duplicatesFound = Parent.Controls 
      .OfType<MyTextBox>() 
      .GroupBy(mtb => mtb.DbColumn) 
      .Any(x => x.Count() > 1); 

     if (duplicatesFound) 
      throw InvalidOperationException("MyTextBoxes with duplicate DbColumn property found."); 
    } 
} 

这是以这样的形式相当昂贵的,但可以很容易地优化以一次为每一个父容器进行检查,而不是n次数(n数MyTextBoxes的)。

+0

感谢您的回复。但我需要的是防止在设计时为DbColumn提供相同的值。通常用户不能在设计时为两个组件命名。是否有可能为我的自定义属性具有此属性。 – 2012-04-20 10:25:47

+0

这不是一个属性,它是设计师的行为。试着把这个逻辑放在你的财产的制定者那里,应该这样做。 – 2012-04-21 14:22:59

+0

谢谢。有用 – 2012-04-22 05:45:22

0

您可以使用随机数或计数器在构造函数中初始化它。如果你选择的柜台,你就需要检查该类的所有其他对象,找到最大的号码,并使用这个号码加1