我正在尝试实施以下内容: Winforms表单上的两个组合框,第一个包含父类别列表,第二个是父类的子项,子列表根据父项中的选择更改内容。
我正在尝试使用数据绑定正确地执行此操作,但我发现使用ComboBox控件有一个奇怪的怪癖。
我手动设置父数据源:
cboParent.DataSource = ParentDataSource
其中ParentDataSource为IList<ParentDTO>
。
然后我可以将seletedItem绑定到DTO:
cboParent.DataBindings.Add(new Binding("SelectedItem", bindingSource, "Parent", true, DataSourceUpdateMode.OnPropertyChanged));
绑定到我的总体DTO上的Parent
ParentDTO
个对象。
到目前为止一切都很标准。一旦我在列表中选择任何新内容,这就可以将更改写回到我的DTO对象中,太棒了!
然后我将子组合框数据源绑定到总体DTO中的列表:
cboChild.DataBindings.Add(new Binding("DataSource", bindingSource, "Children", true, DataSourceUpdateMode.OnPropertyChanged));
儿童在总体DTO上IList<ChildDTO>
。
这也可以正常工作,一旦我更改了父选择,演示者就会更改DTO上的列表Children
,并且cboChildren中显示的值会发生变化,太棒了,我听到你哭了(我自己做了)! / p>
不幸的是,如果您使用数据绑定在ComboBox上设置数据源,那么SelectedItemChanged,SelectedIndexChanged和SelectedValueChanged事件根本不会触发!这意味着OnProperyChanged数据绑定将不适用于第二个组合框。 OnValidation确实有效,但对我来说似乎有点奇怪,我想知道是否有人曾经遇到过这个问题,如果他们找到了如何使它工作的话?
提前致谢
斯图
答案 0 :(得分:0)
还需要帮助吗?你需要为过滤器创建bindingSources和aux文本框,并使用方便的属性bindingSource.filter
以下是:
Dim ds As New DataSet
Dim bind1 As New BindingSource
Dim bind2 As New BindingSource
'' here I add data to the dataset.. you MUST do your own populate way
ds.Merge(GetProducts) ' returns a dataset filled with products
ds.Merge(GetCategories) ' returns a dataset filled with categories
'' after the ds has data
' create binds
bind1.DataSource = ds
bind1.DataMember = "products"
' crete binds
bind2.DataSource = ds
bind2.DataMember = "categories"
txtMaster.DataSource = bind1
txtMaster.DisplayMember = "product_name"
txtMaster.ValueMember = "product_id"
txtDetails.DataSource = bind2
txtDetails.DisplayMember = "category_name"
txtDetails.ValueMember = "category_id"
txtAux.DataBindings.Add("Text", bind1, "product_id") ' bind1 contais products data
' this perform a filter on bind2... that contains categories data
Private Sub txtMaster_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtMaster.SelectedIndexChanged
bind2.Filter = "product_id = '" & txtAux.Text & "'"
End Sub
希望有所帮助
答案 1 :(得分:0)
由于某些原因,我派生了ComboBox,例如支持绑定到null DTO。 这有助于我插入这个功能来解决Binding未更新的问题:
public new object SelectedItem
{
get
{
return base.SelectedItem;
}
set
{
base.SelectedItem = value;
if (value == null || value == System.DBNull.Value)
{
this.SelectedIndex = -1;
}
**foreach (Binding binding in DataBindings)
{
if (binding.PropertyName == "SelectedItem")
{
binding.WriteValue();
}
}**
}
}
如果属性名称为SelectedValue或selectedIndex。
,您可能也想这样做如果这有助于某人请回复!
最诚挚的问候, EFY