2015-04-16 11 views
12

bindingSource bağlayıcı değildir: Özel grup kutusu ben sırayla aşağıdaki nesneye bağlı bir <code>BindingSource</code>, bir <code>GroupBox</code> bağlamak gerekiyor

public class CustomerType 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public MemberType MemberType {get; set;} 
} 

public enum MemberType {Adult, Child} 

Bu answer to create a custom GroupBox izledi. aşağıdaki gibi ben de veri bağlantıları ayarlamak:

groupBoxMemberType.DataBindings.Add("Selected", this.bindingSource, "MemberType"); 

Ancak varolan nesneyi yüklerken, aşağıdaki özel durum alıyorum:

DataBinding tüm bağlamaları için uygundur Listedeki bir satırın bulamıyorum

.

customerType = customerTypeRequest.Load(id); 
bindingSource.DataSource = customerType; //raises exception 

ben eksik: veri kaynağı ayarlarken

durum oluşur? Bir veri kaynağına, özellikle bir BindingSource'a bağlamak için radyo düğmelerinin alınması için bir alternatif var mı?

+0

, son parametrenin (FormattingEnabled) Kamu Cilt ( \t dize propertyName, \t Nesne dataSource, \t dize Datamember, \t bool formattingEnabled) – Mangist

+0

@Mangist The için de geçerlidir geçen deneyin istisna gerçekleşmez. Bununla birlikte, değişiklikler nesneye yüklenmez. –

+0

sorunun özel grup kutusunda olduğundan emin misiniz? Bu satırdaki 'customerType' veri türü nedir: 'bindingSource.DataSource = customerType; '? –

cevap

2

Bu değiştirilen kodudur: enum gelen int değerine Tag özelliğinin ayarlanmasına Dahası

[DefaultBindingProperty("Selected")] 
public class RadioGroupBox : GroupBox 
{ 
    #region events 

    [Description("Occurs when the selected value changes.")] 
    public event SelectedChangedEventHandler SelectedChanged; 

    public class SelectedChangedEventArgs : EventArgs 
    { 
     public int Selected { get; private set; } 

     internal SelectedChangedEventArgs(int selected) 
     { 
      this.Selected = selected; 
     } 
    } 
    public delegate void SelectedChangedEventHandler(object sender, SelectedChangedEventArgs e); 

    #endregion 

    private int selected; 

    [Browsable(false)] 
    [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] 
    [Description("The selected value associated with this control."), Category("Data")] 
    public int Selected 
    { 
     get { return selected; } 
     set 
     { 
      int val = 0; 
      var radioButton = this.Controls.OfType<RadioButton>() 
       .FirstOrDefault(radio => 
        radio.Tag != null 
        && int.TryParse(radio.Tag.ToString(), out val) && val == value); 

      if (radioButton != null) 
      { 
       radioButton.Checked = true; 
       selected = val; 
      } 
     } 
    } 

    protected override void OnControlAdded(ControlEventArgs e) 
    { 
     base.OnControlAdded(e); 

     var radioButton = e.Control as RadioButton; 
     if (radioButton != null) 
      radioButton.CheckedChanged += radioButton_CheckedChanged; 
    } 

    protected void OnSelectedChanged(SelectedChangedEventArgs e) 
    { 
     if (SelectedChanged != null) 
      SelectedChanged(this, e); 
    } 

    private void radioButton_CheckedChanged(object sender, EventArgs e) 
    { 
     var radio = (RadioButton)sender; 
     int val = 0; 
     if (radio.Checked && radio.Tag != null 
      && int.TryParse(radio.Tag.ToString(), out val)) 
     { 
      selected = val; 
      OnSelectedChanged(new SelectedChangedEventArgs(selected)); 
     } 
    } 
} 

, sen örneğin Formunuzda SelectedChanged olaya abone gerekir:

private void radioGroupBoxMemberType_SelectedChanged(object sender, SelectedChangedEventArgs e) 
{ 
    customerType.MemberType = (MemberType)e.Selected; 
} 
Bu sınıfa

İyileştirmeler olacaktır:

  1. RadioButton'dan devralın ve Tag özelliği yerine yeni bir özellik kullanın.

  2. Etkinliğe abone olmamak için bindingsource özelliğine doğrudan erişim denetiminde erişin ve ayarlayın. veri bağlamayı eklerken