在“属性”网格中显示特定属性

时间:2012-11-16 21:57:40

标签: c# winforms user-controls propertygrid

当我们按btnSettings时,所有用户控件属性将显示在属性网格中。我希望显示特定属性(仅 TemperatureValue TemperatureUnit )? 用户控制代码如下:

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

上面代码的用户控件将从下面的代码中调用:

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

    }
}

图片如下: Display Specific Property grid

2 个答案:

答案 0 :(得分:1)

有一种方法。本文有一个名为“自定义PropertyGrid控件”的部分,解释了如何执行此操作http://msdn.microsoft.com/en-us/library/aa302326.aspx#usingpropgrid_topic5

基本上您只想将AppSettings类定义为仅包含TemperatureUnit and TemeratureValue`。

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

定义AppSettings如下;

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

顺便说一下,我正在将类别从杂项更改为全局设置,不知道这是否是你想要的,但当它们是唯一的选择时它才有意义。您可能必须明确声明此BrowsableAttribute(false)的其他属性,因此它们不会显示,但我认为没有必要。

答案 1 :(得分:0)

可能有办法隐藏这些属性,但我认为这是错误的方法。

您应该使用TemperatureUnit和TemperatureValue创建一个模型,而不是传递用户控件本身。将您定义的事件移动到此模型。

然后,您需要扩展您传递模型的用户控件并侦听这些事件。

最后将pGrid.SelectedObject设置为模型,你就可以了。