いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DevExpress奮闘記-074 (CheckEditのちょっとしたTips)(ValueChecked, CheckStyle, RadioGroupIndex)


XtraEditorsには、CheckEditコントロールというのが存在します。
このCheckEditコントロールについての、ちょっとしたTipsです。


(1) ラジオボタンとして利用する
このコントロールは、文字通りチェックボックスを表現するコントロールなのですが
ラジオボタンにもなります。私は、DevExpress使い始めた頃、これを知らなくて
XtraEditorsにはラジオボタンが存在しないと一瞬思ってましたw


チェックボックスをラジオボタンとして利用するには以下のプロパティを設定します。

RepositoryItemCheckEdit.CheckStyle = CheckStyles.Radio;


なお、RepositoryItemCheckEditはCheckEditのPropertiesプロパティから取得できる
ものなので実際には

checkEdit1.Properties.CheckStyle = CheckStyles.Radio;

で設定できます。


(2) ラジオボタンの自動グループ化
ラジオボタンとして利用する場合、よくやるのがグループ化ですね。
特定のラジオボタン群を一つのグループとして排他チェックさせることがよくあります。
その際、CheckEditの場合は以下のプロパティを設定すれば自動的にグループ化してくれます。
(グループボックスなどのコンテナは必要ありません。)

RepositoryItemCheckEdit.RadioGroupIndex = グループ番号(数値)


たとえば、2つラジオボタンがあるとして

rdoEdit1.Properties.RadioGroupIndex = 1;
rdoEdit2.Properties.RadioGroupIndex = 1;


としておけば、rdoEdit1とrdoEdit2は同じグループとなります。
(補足) XtraEditorsには、このほかにもRadioGroupコントロールもあります。こちらも同じように利用できます。


(3) チェック時/アンチェック時/中間ステート時の値を自由に設定
CheckEdit (正確には、RepositoryItemCheckEdit)では、以下のプロパティに
値を設定することにより、チェック時/アンチェック時/中間ステート時の
値を好きに設定することができます。これ、データバインディングするときに
すごく重宝します。ラジオボタンとして利用している場合でも有効です。

  • ValueCheckedプロパティ
    • チェック時の値
  • ValueUncheckedプロパティ
    • アンチェック時の値
  • ValueGrayedプロパティ
    • 中間ステート時の値


上記の3つのプロパティは全部objectを受け取るようになっているので
なんでも設定できます。このプロパティであらかじめチェック時の値などを
設定しておき、実行時にEditValueプロパティから実際の値を設定します。


以下、サンプルです。
[フォームクラス]

using System;
using System.Windows.Forms;

using DevExpress.XtraEditors.Repository;
using DevExpress.XtraEditors.Controls;

namespace WindowsFormsApplication1
{
    /// <summary>
    /// DevExpressのCheckEditコントロールは
    /// 以下のプロパティを持っている。
    /// 
    /// ・ValueChecked
    /// ・ValueUnchecked
    /// 
    /// このプロパティにチェック時およびアンチェック時の
    /// 値を設定することができる。
    /// 
    /// それにより、好きな値でデータバインディングを行う事が
    /// できるようになる。
    /// (データバインディングを行う際に一々モデルを展開する必要がなくなる。)
    /// 
    /// あと、StyleをRadioをすると、ラジオボタンになる。
    /// ラジオボタンにしている場合、「RadioGroupIndex」を設定して
    /// そろえることで、グループボックスなしでラジオボタンをグループ化
    /// することができる。
    /// </summary>
    public partial class Form1 : Form
    {
        FormModel _model;

        public Form1()
        {
            InitializeComponent();

            //
            // チェックボックスとラジオボタンの設定.
            //
            InitializeControls();
        }

        private void InitializeControls()
        {
            //
            // チェックボックスの設定.
            //
            // 以下のプロパティにて、チェック時/アンチェック時/中間ステート時
            // の判定値を設定できる。
            //
            //     ・チェック時  :ValueChecked
            //     ・アンチェック時:ValueUnchcked
            //     ・中間ステート時:ValueGrayed
            //
            RepositoryItemCheckEdit repoChkEdit = chkEdit.Properties;
            repoChkEdit.ValueChecked = "Yes";

            //
            // ラジオボタンの設定.
            //
            // ラジオボタンは、CheckEditのCheckStyleプロパティをRadioに設定する
            // ことでラジオボタンになる。
            //
            // 以下のプロパティにて、チェック時/アンチェック時/中間ステート時
            // の判定値を設定できる。
            //
            //     ・チェック時  :ValueChecked
            //     ・アンチェック時:ValueUnchcked
            //     ・中間ステート時:ValueGrayed
            //
            // さらに、ラジオボタンの場合、以下のプロパティを設定することで
            // 自動的にグループ化することができる。その際、グループボックスなどの
            // コンテナは必要ない。
            //
            repoChkEdit                 = rdoEdit1.Properties;
            repoChkEdit.CheckStyle      = CheckStyles.Radio;
            repoChkEdit.ValueChecked    = 1;
            repoChkEdit.RadioGroupIndex = 1;

            repoChkEdit                 = rdoEdit2.Properties;
            repoChkEdit.CheckStyle      = CheckStyles.Radio;
            repoChkEdit.ValueChecked    = 2;
            repoChkEdit.RadioGroupIndex = 1;

            // このラジオボタンのみ違うグループに所属させる.
            repoChkEdit                 = rdoEdit3.Properties;
            repoChkEdit.CheckStyle      = CheckStyles.Radio;
            repoChkEdit.ValueChecked    = 3;
            repoChkEdit.RadioGroupIndex = 2;

            repoChkEdit                 = rdoEdit4.Properties;
            repoChkEdit.CheckStyle      = CheckStyles.Radio;
            repoChkEdit.ValueChecked    = 4;
            repoChkEdit.RadioGroupIndex = 1;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //
            // データソース生成.
            //
            _model = GetFormModel();

            //
            // ボタンに対してのみ先にデータバインディングを行っておく.
            //
            btnDataBind.DataBindings.Add("Enabled", _model, "DataBindEnabled");
            btnShowObjectValues.DataBindings.Add("Enabled", _model, "ShowModelValuesEnabled");
        }

        private void SetDataBinding()
        {
            //
            // DevExpressの入力コントロールの場合は、標準のコントロールと違い
            // EditValueプロパティが用意されている。
            //
            // データバインディングを行う場合は、このプロパティに対して
            // モデルの値をバインディングする方がよい。
            //
            // 特に、CheckEditの場合でValueCheckedプロパティに設定を行っている
            // 場合は、EditValueにバインディングしておかないと実行時にエラーが発生する。
            // (キャストエラー)
            //
            txtEdit.DataBindings.Add("EditValue",  _model, "TextEditValue");
            clcEdit.DataBindings.Add("EditValue",  _model, "CalcEditValue");
            chkEdit.DataBindings.Add("EditValue",  _model, "CheckBoxValue");
            rdoEdit1.DataBindings.Add("EditValue", _model, "Radio1Value");
            rdoEdit2.DataBindings.Add("EditValue", _model, "Radio1Value");
            rdoEdit3.DataBindings.Add("EditValue", _model, "Radio2Value");
            rdoEdit4.DataBindings.Add("EditValue", _model, "Radio1Value");
            dteEdit.DataBindings.Add("EditValue",  _model, "DateEditValue");
        }

        private void btnDataBind_Click(object sender, EventArgs e)
        {
            //
            // 入力コントロールに対してバインディング設定.
            //
            SetDataBinding();

            //
            // ボタンの状態を変化.
            //
            _model.DataBindEnabled        = false;
            _model.ShowModelValuesEnabled = true;
        }

        private void btnShowObjectValues_Click(object sender, EventArgs e)
        {
            MessageBox.Show(_model.ToString());
        }

        private FormModel GetFormModel()
        {
            return new FormModel
                    {
                        TextEditValue          = "gsf_zero1",
                        CalcEditValue          = 99842,
                        CheckBoxValue          = "Yes",
                        Radio1Value            = 2,
                        Radio2Value            = 3,
                        DateEditValue          = DateTime.Now,
                        DataBindEnabled        = true,
                        ShowModelValuesEnabled = false
                    };
        }
    }
}


[モデルクラス]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;

namespace WindowsFormsApplication1
{
    // モデルのベースクラス.
    abstract class BaseModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(PropertyChangedEventArgs ea)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, ea);
            }
        }

        protected void SetPropertyValue<T>(string name, ref T prop, T newValue)
        {
            if (prop == null && newValue == null)
            {
                return;
            }
                    
            if (prop == null || !prop.Equals(newValue))
            {
                prop = newValue;
                NotifyPropertyChanged(name);
            }
        }

        private void NotifyPropertyChanged(string propertyName)
        {
            OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        }

        public override string ToString()
        {
            List<string> values = new List<string>();

            foreach (PropertyInfo prop in GetType().GetProperties())
            {
                values.Add(string.Format("[{0}]={1}{2}", prop.Name, prop.GetValue(this, null), Environment.NewLine));
            }
                    
            return string.Join(string.Empty, values.ToArray());
        }
    }

    // フォーム用のモデルクラス
    class FormModel : BaseModel
    {
        private string   _textEditValue;
        private int      _calcEditValue;
        private string   _checkBoxValue;
        private int      _radio1Value;
        private int      _radio2Value;
        private DateTime _dateEditValue;
        private bool     _dataBindEnabled;
        private bool     _showModelValuesEnabled;

        public string TextEditValue
        {
            get
            {
                return _textEditValue;
            }
            set
            {
                SetPropertyValue("TextEditValue", ref _textEditValue, value);
            }
        }

        public int CalcEditValue
        {
            get
            {
                return _calcEditValue;
            }
            set
            {
                SetPropertyValue("CalcEditValue", ref _calcEditValue, value);
            }
        }

        public string CheckBoxValue
        {
            get
            {
                return _checkBoxValue;
            }
            set
            {
                SetPropertyValue("CheckBoxValue", ref _checkBoxValue, value);
            }
        }

        public int Radio1Value
        {
            get
            {
                return _radio1Value;
            }
            set
            {
                SetPropertyValue("Radio1Value", ref _radio1Value, value);
            }
        }

        public int Radio2Value
        {
            get
            {
                return _radio2Value;
            }
            set
            {
                SetPropertyValue("Radio2Value", ref _radio2Value, value);
            }
        }

        public DateTime DateEditValue
        {
            get
            {
                return _dateEditValue;
            }
            set
            {
                SetPropertyValue("DateEditValue", ref _dateEditValue, value);
            }
        }

        public bool DataBindEnabled
        {
            get
            {
                return _dataBindEnabled;
            }
            set
            {
                SetPropertyValue("DataBindEnabled", ref _dataBindEnabled, value);
            }
        }

        public bool ShowModelValuesEnabled
        {
            get
            {
                return _showModelValuesEnabled;
            }
            set
            {
                SetPropertyValue("ShowModelValuesEnabled", ref _showModelValuesEnabled, value);
            }
        }
    }
}


実行すると以下のようになります。
[初期表示時]

[データバインドボタン押下]

[モデルの値確認]



================================
過去の記事については、以下のページからご参照下さい。