2009-09-27 7 views
0

Dans un projet Windows Forms, j'ai plusieurs combos. La première zone de liste déroulante contient une liste d'objets. Ces objets ont alors plusieurs listes qui sont utilisées comme sources de données pour les listes déroulantes successives, en fonction de l'élément choisi dans le premier.Pourquoi ces listes déroulantes ne se mettent-elles pas correctement à jour lors du changement de source de données dans Windows Forms (VB)?

Lorsque le premier élément est sélectionné, les autres zones de liste modifient correctement. Lorsque cet élément est modifié une deuxième fois (ou n'importe quelle heure successive), les autres zones de liste déroulante ne sont pas mises à jour correctement. Lors du débogage, cela indique que les autres zones de liste déroulante ont leur source de données correctement assignée, avec le bon 'nombre' d'éléments. Mais les éléments ne s'affichent pas réellement. Quelle pourrait-être la cause?

Private Sub cmbPackage_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPackage.SelectedIndexChanged 
    // The Package controls what other options are available. 
    If (TypeOf (cmbPackage.SelectedItem) Is Package) Then 
     // Set current package as a member object to see if it was a scoping issue 
     _currentPackage = CType(cmbPackage.SelectedItem, Package) 
     ClearOptionDropdowns() 
     cmbReward.DataSource = _currentPackage.Rewards 
     cmbPayment.DataSource = _currentPackage.PaymentTypes 
     cmbCommMethod.DataSource = _currentPackage.CommunicationMethods 
     cmbBillMethod.DataSource = _currentPackage.BillMethods 
     cmbNotification.DataSource = _currentPackage.BillNotifications 

     cmbReward.Refresh() 
     cmbPayment.Refresh() 
     cmbCommMethod.Refresh() 
     cmbBillMethod.Refresh() 
     cmbNotification.Refresh() 
     ... 
     ... 
End Sub 

Private Sub ClearOptionDropdowns() 
    cmbReward.DataSource = Nothing 
    cmbPayment.DataSource = Nothing 
    cmbCommMethod.DataSource = Nothing 
    cmbBillMethod.DataSource = Nothing 
    cmbNotification.DataSource = Nothing 
    ' Also had x.items.clear(), but removed to see if that was affecting it 
End Sub 
+0

Avez-vous essayé d'appeler la méthode '.Refresh()' sur les combobox après avoir défini '.DataSource = Nothing'? – ChrisF

+0

Juste essayé, n'a pas fonctionné. –

Répondre

1

Utiliser réflecteur pour voir ce qui se passe lorsque la source de données est définie, la méthode suivante est appelée:

base.DataSource = value; 

Ce qui fait alors ceci:

if (this.dataSource != value) 
    { 
     try 
     { 
      this.SetDataConnection(value, this.displayMember, false); 
     } 

SetDataConnection:

private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force) 
{ 
    bool flag = this.dataSource != newDataSource; 
    bool flag2 = !this.displayMember.Equals(newDisplayMember); 
    if (!this.inSetDataConnection) 
    { 
     try 
     { 
      if ((force || flag) || flag2) 
      { 
       // Update Accordingly 

Si je manu allly définir le DisplayMember avec un Guid.NewGuid.ToString, la source de données met à jour correctement. Il semble que la comparaison des sources de données détermine qu'elles sont les mêmes quand elles ne le sont certainement pas. Même lorsque j'appelle .DataSource = new List (Of ...) (liste), il ne sera pas mis à jour correctement.

La méthode Object.Equals fait ceci:

InternalEquals(object objA, object objB); 

Ce qui je suppose-t une comparaison de pointeur? Y a-t-il des optimisations que le compilateur pourrait faire pour mettre en cache un objet List, puis remplir cette liste avec les valeurs requises au moment de l'exécution? Je suis certain que chaque liste est une nouvelle liste (de type) lorsque les objets sont créés.