Раскрывающийся список со списком неожиданно закрывается, когда на вкладке управления - PullRequest
0 голосов
/ 22 мая 2009

У меня есть модальная форма с одним экземпляром встроенного элемента управления вкладки .NET 2.0. Элемент управления с вкладками имеет несколько страниц, и на одной из них находится поле со списком, которое не заполняется, пока пользователь не активирует его в первый раз. Когда это происходит, я обрабатываю событие DropDown и запускаю процесс, который занимает несколько секунд, затем я добавляю элементы, возвращенные этим процессом, в поле со списком.

Работает нормально, за исключением того, что сразу после того, как часть списка в выпадающем списке выпадает, он сразу же закрывается, как будто какой-то другой элемент управления получил фокус. Я сузил его до того факта, что в форме есть элемент управления вкладками, а процесс получения элементов для поля со списком занимает более 4 секунд. Если я создаю полностью пустую форму только с полем со списком, я не вижу этого поведения.

Излишне говорить, что это странно, невероятно. Любая идея, почему элемент управления вкладками будет мешать элементу управления, который в настоящее время имеет фокус?

EDIT:

Вот код обработчика события для данного поля со списком. В основном я строю список серверов SQL в сети. То, что занимает несколько секунд, - это вызов 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

            'Retrieve any server aliases on the client and add them to the server list
            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

1 Ответ

0 голосов
/ 26 мая 2009

Мне удалось решить эту проблему.

Сначала я добавил точку останова к событию LostFocus поля со списком и посмотрел на трассировку стека в соответствии с предложением Стива Диньяна, но это ничего не выявило. Особенность моей формы в том, что это поле со списком обычно отключено и становится активным только тогда, когда пользователь устанавливает флажок на той же вкладке. Решение состояло в том, чтобы явно установить фокус на поле со списком, когда флажок был установлен, например, так:

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

Затем выпадающая часть поля со списком показывается нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...