0 votes

La liste déroulante de la zone de combinaison se ferme de manière inattendue lorsqu'elle est sur le contrôle d'onglets

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

0voto

Chris Tybur Points 1269

J'ai pu résoudre ce problème.

J'ai d'abord ajouté un point d'arrêt à l'événement LostFocus de la boîte combo et j'ai regardé la pile d'appels selon la suggestion de Steve Dignan, mais cela n'a rien révélé. Une particularité de mon formulaire est que cette boîte combo est normalement désactivée et ne devient activée que lorsque l'utilisateur coche une case sur la même page d'onglet. La solution était de définir explicitement le focus sur la boîte combo lorsque la case était cochée, comme ceci :

Private Sub chkAltServer_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkAltServer.CheckedChanged
    Try
        If chkAltServer.Checked Then
            UnlockControl(cmbServer)
            cmbServer.Focus()
        Else
            LockControl(cmbServer)
        End If
    Catch ex As Exception
        ErrHandler("frmOptions", "chkAltServer_CheckedChanged", ex.Source, ex.Message, ex.InnerException)
    End Try
End Sub

La partie déroulante de la boîte combo s'est alors affichée normalement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X