前回、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の値を変更しても
両方のコントロールの値が同時に変わります。
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ