如何在自定義web控件上動態創建一些公共屬性。動態創建公共屬性
例如,Web控件有5個TextBox控件。我需要每個TextBox控件的公共屬性來設置TextBox控件的特定屬性。
我希望能夠循環webcontrol中的控件併爲每個TextBox控件創建一個公共屬性。
有什麼想法?
如何在自定義web控件上動態創建一些公共屬性。動態創建公共屬性
例如,Web控件有5個TextBox控件。我需要每個TextBox控件的公共屬性來設置TextBox控件的特定屬性。
我希望能夠循環webcontrol中的控件併爲每個TextBox控件創建一個公共屬性。
有什麼想法?
編輯:
如果孩子的控件存在於設計時,那麼你需要解釋爲什麼要動態地添加屬性訪問控制成員 - 除非有一個很好的理由,它只是聽起來像一個糟糕的設計。
這裏是我的建議:
留下您的控件Friend
或Private
- 不直接暴露它們(它導致緊密耦合,並隨着時間的推移變得討厭)。
公開一個新的公共屬性,獲取/設置控件的1x上的相應屬性;所以如果你想在5x TextBoxes上設置.Text
,你將擁有5x屬性。
完成它。
如果您試圖通過動態添加它們來變得聰明,那麼這是一個很好的意圖,會導致糟糕的結果。請記住:KISS(保持簡單,愚蠢!)。
在設計時出席。 – 2010-07-15 15:35:21
那麼爲什麼動態添加屬性 - 只需將其相關的屬性添加到類 - 在屬性設置器更新相應的控制值。 – STW 2010-07-15 15:45:39
您可以創建這樣
private TextBox[] textBoxes; //declared as a class member variable
public TextBox[] TextBoxes
{
get
{
if (textBoxes == null)
{
textBoxes =(from ctrl in this.Controls.OfType<Control>()
where ctrl is TextBox
select (TextBox)ctrl).ToArray();
}
return textBoxes;
}
}
我需要能夠設置值,雖然...... – 2010-07-15 15:06:42
只要你不試圖用這種方法設置文本框的集合,即使這個屬性是隻讀的,你仍應該可以。你會做一些像'myControl.TextBoxes [0] .Text =「Test」;' – 2010-07-15 15:12:37
這將起作用,但爲什麼不只是將控件暴露爲'Public' ...就我個人而言,我會反對*兩種方法 - 暴露控制廣泛存在於濫用和不良使用方面。 – STW 2010-07-15 17:44:53
暴露包含在WebContol(或與此有關的任何一類)的控件的屬性是不是一個很好的設計,因爲它使你的代碼脆,難以維持。您應該將直接操作TextBoxes的代碼放入WebControl中。
你可以讓它們成爲公共的,然後你可以從頁面訪問它們。 – 2010-07-15 17:47:07