У меня есть модальная форма с одним экземпляром встроенного элемента управления вкладки .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