当DataSource是ComboBox上的数据绑定时,未引发SelectedItem / Index / ValueChanged事件

时间:2009-02-12 10:57:56

标签: c# winforms data-binding combobox

我正在尝试实施以下内容: 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确实有效,但对我来说似乎有点奇怪,我想知道是否有人曾经遇到过这个问题,如果他们找到了如何使它工作的话?

提前致谢

斯图

2 个答案:

答案 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