具有唯一值的自定义组件属性

本文关键字:自定义 组件 属性 唯一 | 更新日期: 2023-09-27 18:31:49

我通过重写文本框组件实现了自定义控件。 它具有一个名为"DbColumn"的自定义属性。 我希望它像 TextBox 上的"名称"属性一样,即一个表单不能在两个控件上具有具有相同"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数量的 MyTextBox)。

您可以在构造函数中使用随机数或计数器对其进行初始化。如果选择计数器,则需要检查该类的所有其他对象,找到最大的数字并使用此数字加 1。