1

当我们按下 btnSettings 时,所有用户控件的属性都会显示在Property grid中。我想显示特定属性(仅TemperatureValueTemperatureUnit),可以吗? 用户控制代码如下:

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

    }
}

图片如下: 显示特定属性网格

4

2 回答 2

1

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

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

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

顺便说一句,我正在将类别从 Misc 更改为 Global Settings,不知道这是否是您想要的,但当它们是唯一的选项时它是有意义的。您可能必须明确声明其他属性,BrowsableAttribute(false)以便它们不会显示,但我认为没有必要。

于 2012-11-16T23:38:05.217 回答
0

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

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

然后,您需要扩展一个用户控件,将模型传递给该用户控件并侦听这些事件。

最后将 pGrid.SelectedObject 设置为您的模型,一切顺利。

于 2012-11-16T23:36:28.093 回答