Je dispose d'un formulaire modal avec une seule instance du contrôle d'onglets .NET 2.0 intégré. Le contrôle d'onglets comporte plusieurs pages, et sur l'une d'elles se trouve une liste déroulante qui n'est pas remplie tant que l'utilisateur ne l'active pas pour la première fois. Lorsque cela se produit, je gère l'événement DropDown et lance un processus qui prend plusieurs secondes, puis j'ajoute les éléments retournés par ce processus à la liste déroulante.
Tout fonctionne bien, sauf qu'après que la liste de la liste déroulante soit affichée, elle se ferme immédiatement comme si un autre contrôle prenait le focus. J'ai réduit le problème au fait qu'il y a un contrôle d'onglets sur le formulaire, et que le processus qui récupère des éléments pour la liste déroulante prend plus de 4 secondes. Si je crée un formulaire complètement vide avec juste la liste déroulante, je ne constate pas ce comportement.
Inutile de dire que c'est étrange au-delà de toute croyance. Avez-vous une idée de pourquoi le contrôle d'onglets interférerait avec le contrôle qui a actuellement le focus?
ÉDITER:
Voici le code du gestionnaire d'événements pour la liste déroulante en question. En substance, je construis une liste de serveurs SQL sur le réseau. Ce qui prend plusieurs secondes, c'est l'appel à GetDataSources.
Private Sub cmbServer_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbServer.DropDown
Dim oTable As DataTable
Dim lstServers As List(Of String)
Dim lstAliases As List(Of String)
Try
If cmbServer.Items.Count = 0 Then
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
oTable = System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources
lstServers = New List(Of String)
For Each oRow As DataRow In oTable.Rows
If oRow("InstanceName").ToString = "" Then
lstServers.Add(oRow("ServerName").ToString)
Else
lstServers.Add(oRow("ServerName").ToString & "\" & oRow("InstanceName").ToString)
End If
Next oRow
'Récupérer les alias serveur sur le client et les ajouter à la liste des serveurs
lstAliases = GetSQLServerAliases()
If lstAliases IsNot Nothing Then
For Each sAlias As String In lstAliases
lstServers.Add(sAlias)
Next sAlias
End If
lstServers.Sort()
For Each sServer As String In lstServers
cmbServer.Items.Add(sServer)
Next sServer
End If
Catch ex As Exception
ErrHandler("frmRefreshDB", "cmbServer_DropDown", ex.Source, ex.Message, ex.InnerException)
Finally
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
If oTable IsNot Nothing Then
oTable.Dispose()
End If
End Try
End Sub