2010-10-08 43 views
3

我想添加一個動態可擴展的屬性到一個複合控件,我可以放在設計器的表面上。我已經嘗試過使用String Array,List和ArrayList。所有的結果都相似。我錯過了一些東西,我不知道是什麼。這裏是我認爲是相關的代碼:如何添加一個集合,例如動態數組作爲一個自定義的asp.net控件的屬性?

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
    NotifyParentProperty(true), 
    PersistenceMode(PersistenceMode.InnerProperty)] 
    public String[] AccessLevels 
    { 
     get 
     { 
      String[] s = (String[])ViewState["AccessLevels"]; 
      return s; 
     } 

     set 
     { 
      ViewState["AccessLevels"] = value; 
     } 
    } 

該控制編譯罰款,我可以把它放在我的設計師表面。它在Visual Studio 2008的「屬性」窗口中爲我提供了一個屬性,名爲「+ AccessLevels」,值爲「String [] Array」,旁邊有一個省略號。如果我點擊elipsis,它會打開一個編輯器,我可以一次插入一行屬性。如果我單擊「AccessLevels」屬性旁邊的小加號符號,它將顯示我輸入的屬性,每個屬性旁邊都有一個數字,表示數組的索引。大!但是當我這樣做時,無論我輸入什麼值作爲屬性,下面的HTML都是由設計者自動生成的。

<cc2:HBAdmin ID="HBAdmin1" runat="server"> 
     <AccessLevels> 
     <system.string></system.string> 
     <system.string></system.string> 
     <system.string></system.string> 
     </AccessLevels> 
    </cc2:HBAdmin> 

HBAdmin是我的控件的名稱,cc2命名空間是正確的。問題是標籤。那裏應該有一個價值嗎?我還爲< AccessLevels>標記獲取了intellisense,告訴我「內容不允許在元素'AccessLevels'的打開和關閉標記之間」,並且還在< system.string>標記上告訴我「元素」系統的驗證錯誤。字符串'不支持。然後,如果我嘗試在瀏覽器中查看帶有控件的頁面(在設計窗口中編輯導致上面標記的屬性之後),我會看到帶有開始標記的行上的以下錯誤控制:

「數組創建必須有數組大小或數組初始化」

我只當我嘗試在設計師的屬性窗口中編輯屬性得到這個錯誤,我可以在值填充屬性。構造函數和t他帶有控件的頁面將在瀏覽器中加載並正常工作,並且值在設計圖面的屬性窗口中顯示正常,我可以在整個控件中使用這些值,但我無法在屬性窗口中對其進行編輯。如果我嘗試添加一個,則會出現與上述相同的症狀。

我覺得我可能只是缺少某種屬性或聲明或東西。請幫忙?

回答

1

試着這麼做:

用法:

​​3210
+0

我試圖用這個代碼,但我不明白的重寫AddParsedSubObject方法。什麼是_customLabelList,它在哪裏定義?是「SomeClass」定義我的複合控件的類,還是它定義了保存我的數據的類型,還是僅用作示例,我會用我的Composite控件替換它? – Camenwolf 2010-10-08 16:02:02

+0

對不起customLabelList是一個私人領域,我會編輯答案。 SomeClass是你的控件,你將把它放在頁面上。您會將我的代碼替換爲您的特定需求。這是我在其中一個網站上使用的示例。 – skyfoot 2010-10-08 16:09:50

+0

當我在設計器中爲屬性賦值時,他們似乎可以工作,但是當我離開設計師時,他們不在屬性窗口中列出,並且它們不會持續。另外,我嘗試在構造函數中添加一些默認值,如this.AddParsedSubObject(new CustomLabel(「thiskey」,「thatvalue」));那麼當我放下設計器上的ctrl時,我會得到「對象引用未設置爲和對象的實例」。所以我嘗試實例化對象並分配它,然後在調用AddParsedSubObject時使用該實例。一樣。 – Camenwolf 2010-10-08 17:01:50

4

您可以使用Collection<string>代替string[]

相關問題