我已通過重寫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