2017-07-19 100 views
5

Mam zaimplementowaną niestandardową siatkę właściwości, chcę wiedzieć, czy mogę zmienić pozycję etykiety każdej właściwości od lewej do prawej.Siatka właściwości: jak ustawić Wyświetlać etykietę nazwy każdej właściwości po prawej stronie siatki?

Moja własna siatka właściwości pokazuje właściwości, jak widać na obrazku.

enter image description here

chcę to zmienić, aby być tak:

enter image description here

To jest główny kod sieci dostosowanej właściwości

public class CustomPropertyGrid : PropertyGrid 
{ 

    private System.ComponentModel.Container components = null; 
    private ReperesentAttr representAttr; 
    private myTab tab; 
    public CustomPropertyGrid() 
    { 
     this.representAttr = new ReperesentAttr("", ""); 
     tab.SetRepresentAttr = this.representAttr; 
     InitializeComponent(); 
     this.PropertySort = PropertySort.Alphabetical; 
     this.RightToLeft = RightToLeft.Yes; 


    // this. 

    } 

    public ReperesentAttr SetRepresentAttr 
    { 
     set 
     { 
      representAttr = value; 
      tab.SetRepresentAttr = this.representAttr; 

     } 
    } 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if (components != null) 
      { 
       components.Dispose(); 
      } 
     } 
     base.Dispose(disposing); 
    } 

    #region Codice generato da Progettazione componenti 
    /// <summary> 
    /// Metodo necessario per il supporto della finestra di progettazione. Non modificare 
    /// il contenuto del metodo con l'editor di codice. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     // 
     // UserControl1 
     // 
     this.Name = "myPropertyGrid"; 

    } 
    #endregion 

    protected override PropertyTab CreatePropertyTab(Type tabType) 
    { 
     tab = new myTab(representAttr); 
     return tab; 
    } 
} 

public class myTab : PropertyTab 
{ 
    private ReperesentAttr representAttr; 
    public myTab(ReperesentAttr representAttr) 
    { 
     this.representAttr = representAttr; 
    } 

    public ReperesentAttr SetRepresentAttr 
    { 
     set 
     { 
      representAttr = value; 
     } 
    } 
    // get the properties of the selected component 
    public override System.ComponentModel.PropertyDescriptorCollection GetProperties(object component, System.Attribute[] attributes) 
    { 
     PropertyDescriptorCollection properties; 
     if (attributes != null) 
      properties = TypeDescriptor.GetProperties(component, attributes); 
     else 
      properties = TypeDescriptor.GetProperties(component); 

     //Componet must implement the ICUSTOMCLASS interface. 
     if (component is ICustomClass) 
     { 
      ICustomClass bclass = (ICustomClass)component; 

      //The new array of properties, based on the PublicProperties properties of "model" 
      PropertyDescriptor[] arrProp = new PropertyDescriptor[bclass.PublicProperties.Count]; 

      for (int i = 0; i < bclass.PublicProperties.Count; i++) 
      { 
       //Find the properties in the array of the propertis which neme is in the PubliCProperties 
       PropertyDescriptor prop = properties.Find(bclass.PublicProperties[i].Name, true); 
       //Build a new properties 
       arrProp[i] = TypeDescriptor.CreateProperty(prop.ComponentType, prop, new CategoryAttribute(this.representAttr.Category)); 

      } 
      return new PropertyDescriptorCollection(arrProp); 
     } 
     else 
     { 
      return properties; 
     } 
    } 

    public override System.ComponentModel.PropertyDescriptorCollection GetProperties(object component) 
    { 
     return this.GetProperties(component, null); 
    } 

    // PropertyTab Name 
    public override string TabName 
    { 
     get 
     { 
      return "Properties"; 
     } 
    } 

    //Image of the property tab (return a blank 16x16 Bitmap) 
    public override System.Drawing.Bitmap Bitmap 
    { 
     get 
     { 
      return new Bitmap(16, 16); 
     } 
    } 

} 
public class ReperesentAttr 
{ 
    string category = string.Empty; 
    string name = string.Empty; 
    public ReperesentAttr(string name, string category) 
    { 
     this.category = category; 
     this.name = name; 
    } 
    public string Category 
    { 
     set { category = value; } 
     get { return category; } 
    } 

    public string Name 
    { 
     set { name = value; } 
     get { return name; } 
    } 
} 
public interface ICustomClass 
{ 
    PropertyList PublicProperties 
    { 
     get; 
     set; 
    } 
} 
public class PropertyList : NameObjectCollectionBase 
{ 
    public void Add(Object value) 
    { 
     //The key for the object is taken from the object to insert 
     this.BaseAdd(((CustomProperty)value).Name, value); 
    } 

    public void Remove(String key) 
    { 
     this.BaseRemove(key); 
    } 

    public void Remove(int index) 
    { 
     this.BaseRemoveAt(index); 
    } 

    public void Clear() 
    { 
     this.BaseClear(); 
    } 

    public CustomProperty this[String key] 
    { 
     get 
     { 
      return (CustomProperty)(this.BaseGet(key)); 
     } 
     set 
     { 
      this.BaseSet(key, value); 
     } 
    } 

    public CustomProperty this[int indice] 
    { 
     get 
     { 
      return (CustomProperty)(this.BaseGet(indice)); 
     } 
     set 
     { 
      this.BaseSet(indice, value); 
     } 
    } 
    public bool HasKey(String key) 
    { 
     foreach(String item in this.BaseGetAllKeys()) 
     { 
      if(key == item) 
       return true; 
     } 

     return false; 
    } 

} 
+1

Nie sądzę, że możesz to zrobić. Siatka wewnętrzna siatki właściwości winforms nie jest konfigurowalna. –

+0

Dziki domysł, ale może właściwość DataGridViewCellStyle.Alignment może pomóc? Przykład: this.dataGridView1.Columns ["CustomerName"]. DefaultCellStyle .Alignment = DataGridViewContentAlignment.MiddleRight; – krzysztofla

+0

To jest siatka własności i różni się od danych grid. @KrzysztofLa –

Odpowiedz

1

Dodaj to do swojej CustomPropertyGrid, to może zacząć:

const int WS_EX_LAYOUTRTL = 0x400000; 
private bool _RTL = false; 

[Description("Change to the right-to-left layout."), DefaultValue(false), 
Localizable(true), Category("Appearance"), Browsable(true)] 
public bool Mirrored 
{ 
    get 
    { 
     return _RTL; 
    } 
    set 
    { 
     if (_RTL != value) 
      _RTL = value; 
     base.OnRightToLeftChanged(EventArgs.Empty); 
    } 
} 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams CP; 
     CP = base.CreateParams; 
     if (this.Mirrored) 
      CP.ExStyle = CP.ExStyle | WS_EX_LAYOUTRTL; 
     return CP; 
    } 
} 

Od https://www.microsoft.com/middleeast/msdn/mirror.aspx

+0

po dodaniu tego kodu pojawia się problem: etykiety przechodzą w prawo, ale ich tekst nie jest wyświetlany. a część staje się czarna: https://www.dropbox.com/s/qjefidstcsxqrja/puo.png?dl=0 –

+0

Ponieważ ten kod używa lub w rozszerzonych stylach okien, może to być przyczyną problemu. Możesz przeczytać na temat rozszerzonych stylów okien tutaj: https://msdn.microsoft.com/en-us/library/ff700543(v=vs.85).aspx, również te style okien: https://msdn.microsoft .com/en-us/library/ms632600 (v = vs.85) .aspx. Zobacz także pytanie o przepełnienie stosu https://stackoverflow.com/questions/8206450/what-are-the-possible-values-for-createparams-style – DafyddNZ