2010-07-15 92 views
1

如何在自定義web控件上動態創建一些公共屬性。動態創建公共屬性

例如,Web控件有5個TextBox控件。我需要每個TextBox控件的公共屬性來設置TextBox控件的特定屬性。

我希望能夠循環webcontrol中的控件併爲每個TextBox控件創建一個公共屬性。

有什麼想法?

+0

你可以讓它們成爲公共的,然後你可以從頁面訪問它們。 – 2010-07-15 17:47:07

回答

1

編輯:

如果孩子的控件存在於設計時,那麼你需要解釋爲什麼要動態地添加屬性訪問控制成員 - 除非有一個很好的理由,它只是聽起來像一個糟糕的設計。

這裏是我的建議:

  • 留下您的控件FriendPrivate - 不直接暴露它們(它導致緊密耦合,並隨着時間的推移變得討厭)。

  • 公開一個新的公共屬性,獲取/設置控件的1x上的相應屬性;所以如果你想在5x TextBoxes上設置.Text,你將擁有5x屬性。

  • 完成它。

如果您試圖通過動態添加它們來變得聰明,那麼這是一個很好的意圖,會導致糟糕的結果。請記住:KISS(保持簡單,愚蠢!)。

+0

在設計時出席。 – 2010-07-15 15:35:21

+0

那麼爲什麼動態添加屬性 - 只需將其相關的屬性添加到類 - 在屬性設置器更新相應的控制值。 – STW 2010-07-15 15:45:39

1

您可以創建這樣

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; 
     } 
    } 
+0

我需要能夠設置值,雖然...... – 2010-07-15 15:06:42

+0

只要你不試圖用這種方法設置文本框的集合,即使這個屬性是隻讀的,你仍應該可以。你會做一些像'myControl.TextBoxes [0] .Text =「Test」;' – 2010-07-15 15:12:37

+0

這將起作用,但爲什麼不只是將控件暴露爲'Public' ...就我個人而言,我會反對*兩種方法 - 暴露控制廣泛存在於濫用和不良使用方面。 – STW 2010-07-15 17:44:53

0

暴露包含在WebContol(或與此有關的任何一類)的控件的屬性是不是一個很好的設計,因爲它使你的代碼脆,難以維持。您應該將直接操作TextBoxes的代碼放入WebControl中。