我已通过重写TextBox组件实现自定义控件。它有一个名为“DbColumn”的自定义属性。我希望它能像TextBox上的“Name”属性那样工作,它是一个Form不能在两个控件上具有相同“DbColumn”值的组件。自定义组件属性具有唯一值
有没有一种方法来设置属性在一个窗体中具有唯一值?
我已通过重写TextBox组件实现自定义控件。它有一个名为“DbColumn”的自定义属性。我希望它能像TextBox上的“Name”属性那样工作,它是一个Form不能在两个控件上具有相同“DbColumn”值的组件。自定义组件属性具有唯一值
有没有一种方法来设置属性在一个窗体中具有唯一值?
如果运行时检查是够你尝试实现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的)。
您可以使用随机数或计数器在构造函数中初始化它。如果你选择的柜台,你就需要检查该类的所有其他对象,找到最大的号码,并使用这个号码加1
感谢您的回复。但我需要的是防止在设计时为DbColumn提供相同的值。通常用户不能在设计时为两个组件命名。是否有可能为我的自定义属性具有此属性。 – 2012-04-20 10:25:47
这不是一个属性,它是设计师的行为。试着把这个逻辑放在你的财产的制定者那里,应该这样做。 – 2012-04-21 14:22:59
谢谢。有用 – 2012-04-22 05:45:22