YD4
YD4

Reputation: 99

Display specific properties in the Property grid

When we press the btnSettings, all the user controls properties will be displayed in Property grid. I want display specific properties (only TemperatureValue and TemperatureUnit), is possible? User control code as follows:

using System;
using System.Windows.Forms;

namespace Temperature
{
    public partial class temperatureUc : UserControl
    {
        public enum temperatureUnit
        {
            Celsius,    // default
            Delisle,    // °De = (100 − °C) * 3⁄2
            Fahrenheit, // °F  = °C * 9⁄5 + 32  
            Kelvin,     // °K  = °C + 273.15
            Newton,     // °N  = °C * 33⁄100
            Rankine,    // °R  = (°C + 273.15) * 9⁄5
            Réaumur,    // °Ré = °C * 4⁄5   
            Rømer       // °Rø = °C * 21⁄40 + 7.5
        }

        public temperatureUc()
        {
            InitializeComponent();
            this.cboTemperatureUnit.DataSource = Enum.GetValues(typeof(temperatureUnit));
        }

        #region "Event"
        public delegate void SettingsStateEventHandler(object sender, EventArgs e);
        public event SettingsStateEventHandler settingsStateChanged;

        private void OnSettingsChanged(object sender, EventArgs e)
        {
            if (this.settingsStateChanged != null)
                this.settingsStateChanged(sender, e);
        }
        #endregion

        #region "Properties"
        private Single _TemperatureValue;
        public Single TemperatureValue
        {
            get
            {
                return this._TemperatureValue;
            }
            set
            {
                if (value.GetType() == typeof(Single))
                {
                    _TemperatureValue = value;
                    this.txtTemperatureValue.Text = _TemperatureValue.ToString();
                }
            }
        }

        private temperatureUnit _TemperatureUnit;
        public temperatureUnit TemperatureUnit
        {
            get
            {
                return this._TemperatureUnit;
            }
            set
            {
                if (value.GetType() == typeof(temperatureUnit))
                {
                    _TemperatureUnit = value;
                    this.cboTemperatureUnit.Text = _TemperatureUnit.ToString();
                }
            }
        }
        #endregion

        private void btnSettings_Click(object sender, EventArgs e)
        {
            this.OnSettingsChanged(sender, e);
        }
    }
}

User control above code will be called from code bellow:

using System;
using System.Windows.Forms;
using Temperature;
using System.Diagnostics;
using System.Drawing;

namespace TemperatureImplements
{
    public partial class Form1 : Form
    {
        private PropertyGrid pGrid  = new PropertyGrid();  

        public Form1()
        {
            InitializeComponent();
            this.temperatureUc1.settingsStateChanged += new temperatureUc.SettingsStateEventHandler(temperatureUc1_settingsStateChanged);
        }

        void temperatureUc1_settingsStateChanged(object sender, EventArgs e)
        {
            pGrid.Size = new Size(300, 500);
            pGrid.Location = new Point(300,10);
            pGrid.SelectedObject = temperatureUc1;
            this.Controls.Add(pGrid);
        }

    }
}

Picture as follows: Display Specific Property grid

Upvotes: 1

Views: 3878

Answers (2)

evanmcdonnal
evanmcdonnal

Reputation: 48076

There is a way. This article has a section called "Customizing the PropertyGrid Control" that explains how to do it http://msdn.microsoft.com/en-us/library/aa302326.aspx#usingpropgrid_topic5

Basically you just want to define the AppSettings class to only include TemperatureUnit andTemeratureValue`.

 AppSettings appset = new AppSettings();
 MyPropertyGrid.SelectedObject = appset;

Define AppSettings as follows;

[DefaultPropertyAttribute("SaveOnClose")]
public class AppSettings{
private bool saveOnClose = true;
private string tempUnit;
private int tempValue;

[CategoryAttribute("Global Settings"),
ReadOnlyAttribute(false),
DefaultValueAttribute("Celsius")]
public string TemperatureUnit
{
    get { return tempUnit; }
    set { tempUnit = value; }
}

[CategoryAttribute("Global Settings"),
ReadOnlyAttribute(false),
DefaultValueAttribute(0)]
public string TemperatureValue
{
    get { return tempValue; }
    set { tempValue = value; }
}
}

By the way, I'm changing the category from Misc to Global Settings, don't know if that's what you want but it makes sense when they're the only options. You may have to explicitly declare the other attributes this BrowsableAttribute(false) so they're not displayed but I don't think it's necessary.

Upvotes: 1

Spencer Ruport
Spencer Ruport

Reputation: 35107

There might be a way to hide those properties but I think that's the wrong way to go about it.

Instead of passing the user control itself you should create a model with TemperatureUnit and TemperatureValue. Move your defined events to this model.

Then you need to extend a user control which you pass the model to and listens for these events.

Finally set pGrid.SelectedObject to your model and you'll be good to go.

Upvotes: 0

Related Questions