2013-04-24 3 views
5

プロパティグリッドを使用すると、複数のオブジェクトに対して1つのプロパティを設定することができます(2番目のレベルがある場合)。両方のプロパティが同じ値を持つ場合、すべて正常に動作するように見えますが、プロパティが等しくない場合、プロパティグリッドはサブプロパティを(矢印から右に)ロードしないため、設定できません。私は次の例を作成しました。コードの長さは残念です。マルチ選択のためのオブジェクトの編集を許可するプロパティグリッドを取得する方法

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     this.Size = new Size(275, 568); 
     PropertyGrid grid = new PropertyGrid(); 
     grid.Dock = DockStyle.Fill; 
     this.Controls.Add(grid); 


     Control c1 = new Control(); 
     c1.Border.Bottom.Color = Color.Red; 
     Control c2 = new Control(); 
     c2.Border.Bottom.Color = Color.Red; 
     Control c3 = new Control(); 
     c3.Border.Bottom.Color = Color.Purple; 

     //This works as expected 
     //grid.SelectedObject = c1; 

     //This works as expected 
     //grid.SelectedObjects = new object[] { c1, c2 }; 

     //This does not work 
     grid.SelectedObjects = new object[] { c1, c3 }; 

    } 
} 

class Control 
{ 
    public Control() 
    { 
     Border = new Border(); 
     Text = "Text"; 
    } 

    public string Text { get; set; } 
    [TypeConverter(typeof(BorderConverter))] 
    public Border Border { get; set; } 
} 

class Border 
{ 
    public Border() 
    { 
     Top = new Line(); 
     Bottom = new Line(); 
     Right = new Line(); 
     Left = new Line(); 
    } 
    [TypeConverter(typeof(LineConverter))] 
    public Line Top { get; set; } 
    [TypeConverter(typeof(LineConverter))] 
    public Line Left { get; set; } 
    [TypeConverter(typeof(LineConverter))] 
    public Line Bottom { get; set; } 
    [TypeConverter(typeof(LineConverter))] 
    public Line Right { get; set; } 

    public override bool Equals(object obj) 
    { 
     if ((obj as Border) == null) 
      return false; 
     Border b = (Border)obj; 
     return b.Left.Equals(Left) && 
      b.Right.Equals(Right) && b.Top.Equals(Top) 
      && b.Bottom.Equals(Bottom); 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 
} 

public class BorderConverter 
: TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return base.CanConvertFrom(context, sourceType); 
    } 

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     return ((destinationType == typeof(InstanceDescriptor)) || base.CanConvertTo(context, destinationType)); 
    } 

    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) 
    { 
     return attributes == null ? TypeDescriptor.GetProperties(value) : TypeDescriptor.GetProperties(value, attributes); 
    } 

    public override bool GetPropertiesSupported(ITypeDescriptorContext context) 
    { 

     return true; 
    } 
} 

class Line 
{ 
    public Line() 
    { 
     Color = Color.Black; 
     Wieght = 0; 
    } 
    public Color Color { get; set; } 
    public int Wieght { get; set; } 

    public override bool Equals(object obj) 
    { 
     if ((obj as Line) == null) 
      return false; 
     Line l = (Line)obj; 
     return l.Color == Color && l.Wieght == Wieght; 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 
} 

public class LineConverter 
: TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return base.CanConvertFrom(context, sourceType); 
    } 

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     return ((destinationType == typeof(InstanceDescriptor)) || base.CanConvertTo(context, destinationType)); 
    } 

    public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues) 
    { 
     if (propertyValues == null) throw new ArgumentNullException("propertyValues"); 
     try 
     { 
      Line bs = new Line(); 
      bs.Color = (Color)propertyValues["Color"]; 
      bs.Wieght = (int)propertyValues["Wieght"]; 
      return bs; 
     } 
     catch (Exception ex) { throw new Exception("Invalid Property value.", ex); } 
    } 

    public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 

    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) 
    { 
     return attributes == null ? TypeDescriptor.GetProperties(value) : TypeDescriptor.GetProperties(value, attributes); 
    } 

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
    { 
     return base.GetStandardValuesSupported(context); 
    } 

    public override bool GetPropertiesSupported(ITypeDescriptorContext context) 
    { 

     return true; 
    } 
} 

答えて

2

私はLineConverterからGetCreateInstanceSupported方法を除去することによって、それが仕事を得るために管理が、私はPropertyGridTypeDescriptorインフラストラクチャを使用する方法を豊富な知識を持っていないので、私はあなたの問題の主な原因で正確に把握していません。

+0

私が探していたものではありませんが、それは答えです! –

関連する問題