Iva*_*ono 12 c# visual-studio winforms visual-studio-2012
我需要将a绑定GroupBox
到a BindingSource
,而a 又绑定到以下对象:
public class CustomerType
{
public int Id {get; set;}
public string Name {get; set;}
public MemberType MemberType {get; set;}
}
public enum MemberType {Adult, Child}
Run Code Online (Sandbox Code Playgroud)
我按照这个答案创建了一个自定义GroupBox.我还设置了数据绑定如下:
groupBoxMemberType.DataBindings.Add("Selected", this.bindingSource, "MemberType");
Run Code Online (Sandbox Code Playgroud)
但是,在加载现有对象时,我得到以下异常:
DataBinding在列表中找不到适合所有绑定的行.
设置数据源时发生异常:
customerType = customerTypeRequest.Load(id);
bindingSource.DataSource = customerType; //raises exception
Run Code Online (Sandbox Code Playgroud)
我错过了什么?是否有替代方法可以将单选按钮绑定到数据源,特别是BindingSource
?
这是更改后的代码:
[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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
进一步将Tag
属性设置为枚举的相应 int 值,您需要订阅表单中的 SelectedChanged 事件,例如:
private void radioGroupBoxMemberType_SelectedChanged(object sender, SelectedChangedEventArgs e)
{
customerType.MemberType = (MemberType)e.Selected;
}
Run Code Online (Sandbox Code Playgroud)
对这个类的改进是:
继承自RadioButton并使用新的属性来代替该Tag
属性。
直接在控件中访问和设置 BindingSource 属性以避免订阅事件。
归档时间: |
|
查看次数: |
848 次 |
最近记录: |