2016-12-26 22 views
2

私は、ラジオボタンとカスタムオブジェクトをデータソースとしてほとんど使用していないとします。WindowsフォームのRadioButtonリスト - RadioButtonにEnumプロパティをバインドする

のようなもので、3種類のラジオボタンに、このオブジェクトのプロパティ(その可能な場合)をバインドする方法

public enum SomeModeType 
{ 
    firstMode = 10, 
    secondMode = 20, 
    thirdMode = 30 
} 

public class MyCustomObject:INotifyPropertyChanged 
{ 

    private SomeModeType _mode; 
    public SomeModeType Mode 
    { 
     set { _mode = value; } 
     get { return _mode; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

例として:radiobuttonOneがチェックされている場合

からfirstMode

に設定modeオブジェクトのプロパティradiobuttonTwoチェック - オブジェクトプロパティmodesecondMode

に設定されている

radiobuttonThreeはチェックされている場合 - thirdMode

などなど

またはその本のためにイベントを使用することをお勧めに設定modeオブジェクトのプロパティを?

P.S. イベントを使用する方法はわかっていますが、イベントでイベントを作成するには、rb1chnagedrb2changed、...、rb100changedのように大変ですね。

P.P.S.

メリークリスマス!

+0

あなたが列挙型を宣言している場合、それはただ一つのエントリです。ラジオボタンリストにバインドするにはコレクションが必要です。 'List 'をプロパティとして宣言して、enum –

+0

@AnupSharmaの各メンバーに記入してください。しかし、thatsはどのように役立ちますか? 私は、ラジオボタンをそれにバインドするだけでいいのです.1番目を選択すると、フィールド値がfirstModeになり、2番目の場合はフィールド値がsecondModeに書き換えられます。 – DanilGholtsman

+0

私は[RadioButtonList]コントロールを共有しました[ここ] (http://stackoverflow.com/a/41355419/3110834)。 –

答えて

1

列挙型の値ごとに、RadioButtonを作成し、Checkedの値をModeのデータソースのプロパティにバインドする必要があります。次にModeの値をCheckedのプロパティに適した値に変換するには、BindingFormatParseイベントを使用する必要があります。

例 - たとえば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); 
}); 

dataSourceDataSourceList<MyCustomObject>が含まMyCustomObjectまたはBindingList<MyCustomObject>又はBindingSourceとすることができます。

別の選択肢 - RadioButtonのリストあなたがListBoxをオーナー描画を使用してアイテムのためRadioButtonレンダリングすることができます別の選択肢としてオーナー描画リストボックス

を使用。この方法で、SelectedValueListBoxをオブジェクトのプロパティ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); 
}; 

スクリーンショット

あなたは画像を次の両方のソリューションを見ることができます:

enter image description here

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)); 
+0

しかし、それ以上のsimle方法はありません? ._。 – DanilGholtsman

+0

残念ながら、いいえ、すべてのロジックを1つのコントロールにカプセル化し、 'RadioButtonList'のような名前を付けない限り、より簡単な方法はありません。 –

+0

もう1つの選択肢(これ以上は単純ではありません)は、owner-draw Listboxを使用しています。私もそれを共有します。 –

関連する問題