列挙型の値ごとに、RadioButton
を作成し、Checked
の値をMode
のデータソースのプロパティにバインドする必要があります。次にMode
の値をChecked
のプロパティに適した値に変換するには、Binding
のFormat
とParse
イベントを使用する必要があります。
例 - たとえばFlowLayoutPanel
を使用してRadioButtonの一覧は、以下のコードForm
書き込みのLoad
場合には、その後、フォーム上のコントロールFlowLayoutPanel
を入れて。コードは、動的フローレイアウトパネルにRadioButton
コントロールを追加して、データバインディング実行されます。上記の例で
var enumValues = Enum.GetValues(typeof(SomeModeType)).Cast<object>()
.Select(x => new { Value = x, Name = x.ToString() }).ToList();
enumValues.ForEach(x =>
{
var radio = new RadioButton() { Text = x.Name, Tag = x.Value };
var binding = radio.DataBindings.Add("Checked", dataSource,
"Mode", true, DataSourceUpdateMode.OnPropertyChanged);
binding.Format += (obj, ea) =>
{ ea.Value = ((Binding)obj).Control.Tag.Equals(ea.Value); };
binding.Parse += (obj, ea) =>
{ if ((bool)ea.Value == true) ea.Value = ((Binding)obj).Control.Tag; };
flowLayoutPanel1.Controls.Add(radio);
});
をdataSource
はDataSource
でList<MyCustomObject>
が含まMyCustomObject
またはBindingList<MyCustomObject>
又はBindingSource
とすることができます。
別の選択肢 - RadioButtonのリストあなたがListBox
をオーナー描画を使用してアイテムのためRadioButton
レンダリングすることができます別の選択肢としてオーナー描画リストボックス
を使用。この方法で、SelectedValue
のListBox
をオブジェクトのプロパティMode
にバインドできます。次のコードのdataSourcs
は上記の例のようになります。フォーム上のListBox
を入れて、フォームのLoad
イベントに次のコードを記述します。
var enumValues = Enum.GetValues(typeof(SomeModeType)).Cast<object>()
.Select(x => new { Value = x, Name = x.ToString() }).ToList();
this.listBox1.DataSource = enumValues;
this.listBox1.ValueMember = "Value";
this.listBox1.DisplayMember = "Name";
this.listBox1.DataBindings.Add("SelectedValue", dataSource,
"Mode", true, DataSourceUpdateMode.OnPropertyChanged);
this.listBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.listBox1.ItemHeight = RadioButtonRenderer.GetGlyphSize(
Graphics.FromHwnd(IntPtr.Zero),
RadioButtonState.CheckedNormal).Height + 4;
this.listBox1.DrawItem += (obj, ea) =>
{
var lb = (ListBox)obj;
ea.DrawBackground();
var text = lb.GetItemText(lb.Items[ea.Index]);
var r = ea.Bounds;
r.Offset(ea.Bounds.Height, 0);
RadioButtonRenderer.DrawRadioButton(ea.Graphics,
new Point(ea.Bounds.Location.X, ea.Bounds.Location.Y + 2), r, text,
lb.Font, TextFormatFlags.Left, false,
(ea.State & DrawItemState.Selected) == DrawItemState.Selected ?
RadioButtonState.CheckedNormal : RadioButtonState.UncheckedNormal);
};
スクリーンショット
あなたは画像を次の両方のソリューションを見ることができます:

var list = new List<MyCustomObject>() {
new MyCustomObject(){ Mode= SomeModeType.firstMode},
new MyCustomObject(){ Mode= SomeModeType.secondMode},
new MyCustomObject(){ Mode= SomeModeType.thirdMode},
};
this.myCustomObjectBindingSource.DataSource = list;
var dataSource = myCustomObjectBindingSource;
注
この質問に答えた後、私はRadioButtonList
のコントロールを作成してこの投稿に入れました:WinForms RadioButtonList doesn't exist。
データバインディングがサポートされており、このコントロールはListBox
のように使用できます。そのためには、モデルのプロパティにバインドするのに十分だし、単にこの方法でコントロールのデータソースを設定します。
radioButtonList1.DataSource = Enum.GetValues(typeof(YourEnumType));
あなたが列挙型を宣言している場合、それはただ一つのエントリです。ラジオボタンリストにバインドするにはコレクションが必要です。 'List 'をプロパティとして宣言して、enum –
@AnupSharmaの各メンバーに記入してください。しかし、thatsはどのように役立ちますか? 私は、ラジオボタンをそれにバインドするだけでいいのです.1番目を選択すると、フィールド値がfirstModeになり、2番目の場合はフィールド値がsecondModeに書き換えられます。 – DanilGholtsman
私は[RadioButtonList]コントロールを共有しました[ここ] (http://stackoverflow.com/a/41355419/3110834)。 –