いろいろ備忘録日記

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

DevExpress奮闘記-075 (RadioGroupコントロール)(RadioGroupItem, ValidateOnEnterKey)

前回、CheckEditを取り上げたのでついでに。
XtraEditorsには、RadioGroupコントロールというのが存在します。


このコントロールは、ラジオボタンのグルーピングを作成するためのコントロールです。
GroupBoxとラジオボタンのセットみたいな感じです。


前回は、CheckEditコントロールを利用してラジオボタンを作成していましたが
RadioGroupを利用することでも作成できます。


RadioGroupコントロールにラジオボタンを追加するには、

radioGroup1.Properties.Items

に対して、RadioGroupItemオブジェクトを追加していきます。

RadioGroupItem item = new RadioGroupItem();
item.Description = "Radio 1";
item.Value       = 1;
item.Enabled     = true;

RadioGroupItemのDescriptionにラジオボタンのキャプションを
Valueプロパティにチェック時の値を設定します。
Valueプロパティはobjectを受け取るので何でも設定できます。


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

using System;
using System.Windows.Forms;

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        FormModel _model;

        public Form1()
        {
            InitializeComponent();

            //
            // コントロールの初期設定.
            //
            InitializeControls();
        }

        private void InitializeControls()
        {
            //
            // RadioGroupの設定.
            //
            RepositoryItemRadioGroup repoRadioGroup = radioGroup1.Properties;
            repoRadioGroup.Items.Clear();

            for (int i = 0; i < 10; i++)
            {
                RadioGroupItem radioItem = new RadioGroupItem();
                radioItem.Description    = string.Format("Radio {0}", (i + 1));
                radioItem.Value          = (i + 1);
                radioItem.Enabled        = true;

                repoRadioGroup.Items.Add(radioItem);
            }

            //
            // SpinEditの設定.
            //
            RepositoryItemSpinEdit repoSpinEdit = spinEdit1.Properties;
            repoSpinEdit.AllowNullInput     = DefaultBoolean.False;
            repoSpinEdit.ValidateOnEnterKey = true;
            repoSpinEdit.MaxValue           = 10;
            repoSpinEdit.MinValue           = 1;
            repoSpinEdit.IsFloatValue       = false;
            repoSpinEdit.EditMask           = "N00";
            repoSpinEdit.Mask.EditMask      = "N00";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //
            // データソース生成.
            //
            _model = new FormModel{ RadioValue = 4 };

            //
            // データバインディング設定.
            //
            radioGroup1.DataBindings.Add("EditValue", _model, "RadioValue");
            spinEdit1.DataBindings.Add("EditValue", _model, "RadioValue");

            //
            // それぞれのコントロールにて、値が変更されると
            // 互いに通知されるようにイベント設定.
            //
            radioGroup1.SelectedIndexChanged += (s1, e1) =>
            {
                radioGroup1.DataBindings["EditValue"].WriteValue();
            };

            spinEdit1.ValueChanged += (s1, e1) =>
            {
                spinEdit1.DataBindings["EditValue"].WriteValue();
            };
        }        
    }
}


[モデルクラス]

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 int _radioValue;

        public int RadioValue
        {
            get
            {
                return _radioValue;
            }
            set
            {
                SetPropertyValue("RadioValue", ref _radioValue, value);
            }
        }
    }
}

画面イメージは以下のような感じです。

今回のサンプルでは、双方向の変更通知をサポートさせているので
RadioGroupのラジオを変更しても、SpinEditの値を変更しても
両方のコントロールの値が同時に変わります。



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