1

btnSettingsを押すと、すべてのユーザーコントロールのプロパティがプロパティグリッドに表示されます。特定のプロパティ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

基本的には、 TemeratureValue`AppSettingsのみを含むようにクラスを定義するだけです。TemperatureUnit and

 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)表示されないようにする必要があるかもしれませんが、必要ではないと思います。

于 2012-11-16T23:38:05.217 に答える
0

それらのプロパティを非表示にする方法があるかもしれませんが、それは間違った方法だと思います。

ユーザーコントロール自体を渡す代わりに、TemperatureUnitとTemperatureValueを使用してモデルを作成する必要があります。定義したイベントをこのモデルに移動します。

次に、モデルを渡し、これらのイベントをリッスンするユーザーコントロールを拡張する必要があります。

最後に、pGrid.SelectedObjectをモデルに設定すると、準備が整います。

于 2012-11-16T23:36:28.093 に答える