编程语言
首页 > 编程语言> > c#-.NET PropertyGrid:使用ExpandableObjectConverter更改复杂对象的读/写权限

c#-.NET PropertyGrid:使用ExpandableObjectConverter更改复杂对象的读/写权限

作者:互联网

我正在尝试在PropertyGrid控件中编辑复杂的对象.我将ExpandableObjectConverter(或需要时我自己的子类)添加为TypeConverter,并且工作正常.

我似乎无法弄清的一件事就是这个.在网格中,对象本身将在其旁边具有其.ToString()表示形式.然后,当我展开对象时,属性具有相同的属性.所有都可以编辑.我想禁用ToString()对象字段的编辑,但保持属性可编辑.

因此,在PropertyGrid中,它看起来像这样;

+ Color      {(R,G,B,A) = (255,255,255,255)}  --uneditable
     Alpha   255                              --editable
     Blue    255                              --editable
     Green   255                              --editable
     Red     255                              --editable

到目前为止,我还没有找到一种方法来做到这一点.如果我尝试将其设置为ReadOnly,则整个对象将变为只读.如果我指定我自己的ExpandableObjectConverter并声明它不能从字符串转换,如果在PropertyGrid中编辑了字符串,它将仍然尝试强制转换然后失败.

我本质上只是想要它,所以我可以阻止最终用户编辑字符串,而迫使他们编辑各个属性,这样就不必为每个类编写字符串解析器.

这可能吗,或者还有我没想到的另一种方法?

解决方法:

这似乎可以解决问题:

[TypeConverter(typeof (Color.ColorConverter))]
public struct Color
{
    private readonly byte alpha, red, green, blue;
    public Color(byte alpha, byte red, byte green, byte blue)
    {
        this.alpha = alpha;
        this.red = red;
        this.green = green;
        this.blue = blue;
    }
    public byte Alpha { get { return alpha; } }
    public byte Red { get { return red; } }
    public byte Green { get { return green; } }
    public byte Blue { get { return blue; } }
    public override string ToString()
    {
        return string.Format("{{(R,G,B,A) = ({0},{1},{2},{3})}}", Red, Green, Blue, Alpha);
    }
    private class ColorConverter : ExpandableObjectConverter
    {
        public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
        {
            return true;
        }
        public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
        {
            return new Color((byte)propertyValues["Alpha"], (byte)propertyValues["Red"],
                             (byte) propertyValues["Green"], (byte) propertyValues["Blue"]);
        }
    }
}

标签:propertygrid,c,net,winforms
来源: https://codeday.me/bug/20191102/1988248.html