2013-04-08 70 views
2

我有一些公共領域的一類,我想顯示在窗體上的PropertyGrid此字段:禁止收集

public class FileInfo 
{ 
    ... 

    [DisplayName("Messages")] 
    public Collection<MessageInfo> MessageInfos { get; set; } 
} 

的問題是,我也想禁用收集此類的某些情況下,所以用戶甚至不能進入其編輯器。我需要從代碼中,而不是從設計者那裏獲得。

即使我做這個領域只讀通過添加屬性[只讀(真),將允許用戶通過按下進入它的編輯(...):

enter image description here

+0

當你說設計師......你指的是Visual Studio中,你的程序,等等? – Jared 2013-04-08 04:08:19

回答

2

你可以做,如果你自定義一個UITypeEditor重寫標準CollectionEditor,這樣的事情:

public class FileInfo 
    { 
     [DisplayName("Messages")] 
     [Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))] 
     public Collection<MessageInfo> MessageInfos { get; set; } 
    } 

    public class MyCustomCollectionEditor : CollectionEditor // needs a reference to System.Design.dll 
    { 
     public MyCustomCollectionEditor(Type type) 
      : base(type) 
     { 
     } 

     public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
     { 
      if (DontShowForSomeReason(context)) // you need to implement this 
       return UITypeEditorEditStyle.None; // disallow edit (hide the small browser button) 

      return base.GetEditStyle(context); 
     } 
    } 
+0

謝謝,這正是我需要的。 – Andark 2013-04-09 03:36:34

0

添加一個布爾標誌指示集合是否爲只讀:

public class FileInfo 
{ 
    ... 

    [DisplayName("Messages")] 
    public Collection<MessageInfo> MessageInfos { get; set; } 
    public bool IsReadOnly; 
} 

設置IsReadOnlytrue爲要禁用這些實例。然後,您可以根據標誌的狀態啓用/禁用UI。

+0

IsReadOnly將顯示爲另一個屬性,它對MessageInfos沒有意義。 – Andark 2013-04-08 04:03:44

+0

@andark - 如果您只是將IsReadOnly設置爲公共字段而不是屬性,它仍會顯示嗎?更新代碼以反映這一建議。 – 2013-04-08 04:16:00

+0

如果它不是一個屬性,它不會顯示給用戶,但我可以任何方式輸入Collection的編輯器。 – Andark 2013-04-08 04:26:48

0

取決於您的程序設計。你可能會使用繼承。你並沒有真正提供有關誰可以訪問你的對象等信息。隨着缺乏細節,那麼它需要在代碼中,而不是設計師,這是一個簡單的解決方案。或者你可能需要更強大的東西。

public class FileInfo 
{ 
    //... 
} 

public class FileInfoWithCollection : FileInfo { 
    [DisplayName("Messages")] 
    public Collection<MessageInfo> MessageInfos { 
      get; 
      set; 
    }  
} 

另一種選擇可能是推出的Collection自己繼承的副本將覆蓋可以修改集合中的任何方法。如果沒有更多的信息,並且收集是一種參考類型,我懷疑你會得到一個肯定的答案。

0

在屬性的頂部添加ReadOnly屬性。

[DisplayName("Messages")] 
[ReadOnly(true)] 
public Collection<MessageInfo> MessageInfos { get; set; } 

還沒有測試過,希望它有效。

摘自this link