2013-04-24 79 views
5

當使用屬性網格時,如何獲取它以允許我一次爲多個對象設置一個屬性(當存在第二個級別時)。如果兩個屬性都具有相同的值,一切似乎都可以正常工作,但如果屬性不相等,則propertygrid不會加載子屬性(從箭頭到右側),因此無法設置它們。我已經創建了下面的例子,對於代碼的長度抱歉。如何獲取屬性網格以允許編輯多個對象的對象

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方法的工作,但我不知道到底是什麼是您的問題的主要原因,因爲我沒有廣博的知識如何PropertyGrid使用TypeDescriptor基礎設施。

+0

不完全是我正在尋找,但它是一個答案! – 2013-05-02 21:25:59

相關問題