5

I have implemented a custom property grid, I want to know if I can change position of label of each property from left to the right.

My custom property grid shows property as you can see in the picture.

enter image description here

I want to change it to be like this:

enter image description here

This is main code of Custom Property grid

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;
    }

}
Nastaran Hakimi
  • 695
  • 1
  • 16
  • 36
  • 1
    I don't think you can do this. The winforms property grid's internal grid is not configurable. – Simon Mourier Jul 19 '17 at 15:43
  • Wild guess but maybe DataGridViewCellStyle.Alignment Property could help? Example: this.dataGridView1.Columns["CustomerName"].DefaultCellStyle .Alignment = DataGridViewContentAlignment.MiddleRight; – Krzysztof Lach Jul 19 '17 at 19:48
  • It is property grid and different from dataGrid . @KrzysztofLa – Nastaran Hakimi Jul 21 '17 at 07:15
  • @SimonMourier what is this.RightToLeft = RightToLeft.Yes for? because I thought when I set this for default property grid and not custom, all labels go on the right of the property grid. – Nastaran Hakimi Jul 21 '17 at 07:18
  • This is a generic property of the Control base class, not specific to the PropertyGrid. So, yes, it could have worked that way, but it seems the PropertyGrid developer don't use it when they paint their grid. – Simon Mourier Jul 21 '17 at 07:26
  • The Microsoft PropertyGrid control doesn't support RTL layout. Paid alternatives include http://www.telerik.com/products/winforms/property-grid.aspx and http://visualhint.com/propertygrid – Michael Liu Jul 22 '17 at 20:29

1 Answers1

1

Add this to your CustomPropertyGrid, this may get you started:

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;
    }
}

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

DafyddNZ
  • 234
  • 2
  • 12
  • there is a problem when I added this code :labels go to the right but their text isn't shown. and some part become black : https://www.dropbox.com/s/qjefidstcsxqrja/puo.png?dl=0 – Nastaran Hakimi Jul 29 '17 at 09:23
  • 1
    Because this code uses or on the Extended windows styles, this may be causing the issue. You may want to read up on the extended windows styles here https://msdn.microsoft.com/en-us/library/ff700543(v=vs.85).aspx, also these windows styles https://msdn.microsoft.com/en-us/library/ms632600(v=vs.85).aspx. Also see this stack overflow question https://stackoverflow.com/questions/8206450/what-are-the-possible-values-for-createparams-style – DafyddNZ Jul 30 '17 at 23:18