Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET PropertyGrid:使用ExpandableObjectConverter更改复杂对象的读/写权限_C#_.net_Winforms_Propertygrid - Fatal编程技术网

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

C# .NET PropertyGrid:使用ExpandableObjectConverter更改复杂对象的读/写权限,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,我正在尝试编辑PropertyGrid控件中的复杂对象。我添加了ExpandableObjectConverter(或者在需要时添加我自己的子类)作为TypeConverter,它工作得很好 有一件事我似乎弄不明白。在网格中,对象本身旁边将有其.ToString()表示形式。然后,当我展开对象时,属性具有相同的属性。所有都可以编辑。我想禁用ToString()对象字段的编辑,但保持属性可编辑 所以在PropertyGrid中,它看起来是这样的 + Color {(R,G,B,A) =

我正在尝试编辑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
到目前为止,我还没有找到这样做的方法。如果我尝试使其为只读,则整个对象将变为只读。如果我指定自己的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"]);
        }
    }
}

颜色是我自己的名为“Color4”的类,不是.NET类,对不起。它是
还是
结构
?(我在考虑不同的选择)k;我有一些对课堂有用的东西;我将尝试让它为struct工作……原因有二:首先,大多数struct应该是不可变的(意思是:没有setter)——这需要
CreateInstance
模式;其次,对于结构,网格最终编辑了值的一个断开连接的盒装副本,否则,这意味着您可以进行从未应用于实际实例的更改(您可以通过向结构添加setter并删除create instance内容来看到这一点),但基本相同,但没有CreateInstance内容。同样重要的是,
CanConvertFrom
报告字符串的
false
(以避免使文本版本可编辑),但IIRC是默认值。特别是,当它是一个类时,我让成员是可变的