2009-02-12 5 views
1

J'essaie d'implémenter ce qui suit: Deux listes déroulantes sur un formulaire Winforms, le premier a une liste de catégories parentes, le second est enfant du parent , la liste des enfants change de contenu en fonction de la sélection dans le parent.Événements SelectedItem/Index/ValueChanged non déclenchés lorsque DataSource est Databound sur ComboBox

Je suis en train de le faire en utilisant correctement mais je suis databinding trouver une bizarrerie avec le contrôle ComboBox.

I régler la source de données du parent manuellement:

cboParent.DataSource = ParentDataSource où ParentDataSource est IList<ParentDTO>. Je peux alors lier le seletedItem à la DTO ainsi:

cboParent.DataBindings.Add(new Binding("SelectedItem", bindingSource, "Parent", true, DataSourceUpdateMode.OnPropertyChanged)); se liant à Parent un objet ParentDTO sur mon DTO global.

Tous assez standard jusqu'à présent. Cela fonctionne et écrit le changement à mon objet DTO dès que je sélectionne quelque chose de nouveau dans la liste, génial!

Je lie alors la zone de liste déroulante de l'enfant à une source de données liste les objectifs primordiaux DTO: cboChild.DataBindings.Add(new Binding("DataSource", bindingSource, "Children", true, DataSourceUpdateMode.OnPropertyChanged)); où les enfants est un IList<ChildDTO> sur le DTO global. Cela fonctionne également bien et dès que je change la sélection parent, le présentateur change la liste Children sur le DTO et les valeurs affichées dans les changements cboChildren, fantastique, je vous entends pleurer (et je l'ai fait moi-même)! Il semble malheureusement que si vous utilisez la liaison de données pour définir la source de données sur un ComboBox, les événements SelectedItemChanged, SelectedIndexChanged et SelectedValueChanged ne se déclenchent pas du tout, jamais! Cela signifie que la liaison de données OnProperyChanged ne fonctionnera pas pour la deuxième liste déroulante. OnValidation fonctionne, mais il me semble un peu bizarre et je me demandais si quelqu'un avait rencontré auparavant et si elles avaient travaillé sur la façon de le faire fonctionner?

Merci à l'avance

Stu

Répondre

0

bien encore besoin d'aide? vous devez créer bindingSources et une zone de texte pour un filtre aux et utiliser la propriété à portée de main bindingSource.filter

Voici comment:

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 

espèrent qu'il aide

0

Je dérivé ComboBox pour quelques raisons, par exemple pour prendre en charge la liaison à null DTO. Cela m'a aidé à insérer cette functinulity pour résoudre le problème que la liaison ne soit pas mise à jour:

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(); 
      } 
     }** 
    } 
} 

Vous pouvez le faire aussi si le nom de la propriété est SelectedValue ou selectedIndex.

Si cela a aidé quelqu'un s'il vous plaît republier!

Cordialement, Efy

Questions connexes