禁用收集

时间:2013-04-08 03:15:36

标签: c# propertygrid

我有一个包含一些公共字段的类,我希望在表单上的PropertyGrid中显示这些字段:

public class FileInfo
{
     ...

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

问题是我还想为这个类的某些实例禁用Collection,因此用户甚至无法进入其编辑器。我需要从代码中创建它,而不是从设计器中创建它。

即使我通过添加属性[ReadOnly(true)]创建此字段ReadOnly,它也允许用户通过按(...)进入其编辑器:

enter image description here

4 个答案:

答案 0 :(得分: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);
        }
    }

答案 1 :(得分:0)

添加一个布尔标志,指示集合是否为只读:

public class FileInfo
{
    ...

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

IsReadOnly设置为true以查找要禁用的实例。然后,您可以根据标志的状态启用/禁用UI。

答案 2 :(得分:0)

取决于您的计划的设计。你可以使用继承。你没有真正提供有关谁有权访问你的对象等信息。由于缺乏其他细节,它需要在代码中而不是设计者这是一个简单的解决方案。或者你可能需要更强大的东西。

public class FileInfo
{
     //...
}

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

另一个选项可能是滚动您自己的Collection的继承副本,该副本会覆盖任何可能修改集合的方法。如果没有更多的信息,并且集合是一个参考类型的事实,我怀疑你会得到一个肯定的答案。

答案 3 :(得分:0)

在属性顶部添加ReadOnly属性。

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

尚未测试,希望它有效。

取自this link