我有一个带有内置.NET 2.0选项卡控件的单个实例的模式窗体。选项卡控件有几个页面,其中一个是一个组合框,在用户第一次激活它之前,它不会被填充。当发生这种情况时,我处理DropDown事件并运行一个需要几秒钟的进程,然后我将该进程返回的项添加到组合框中。
它工作正常,除了在组合框的列表部分下拉之后,它立即关闭,好像其他一些控件占据焦点一样。我已经将其缩小到表单上有一个选项卡控件的事实,并且检索组合框的项目的过程需要4秒以上。如果我只使用组合框创建一个完全空白的表单,我看不到这种行为。
毋庸置疑,这超乎想象。知道选项卡控件为什么会干扰当前关注的控件吗?
编辑:
这是给定组合框的事件处理程序代码。基本上我正在构建网络上的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
答案 0 :(得分:0)
我能够解决这个问题。
我首先在组合框的LostFocus事件中添加了一个断点,并根据Steve Dignan的建议查看了堆栈跟踪,但这并没有透露任何信息。关于我的表单有一点特别之处是这个组合框通常被禁用,只有在用户选中同一标签页上的框时才会启用。解决方案是在选中框时将焦点显式设置为组合框,如下所示:
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
然后,组合框的下拉部分显示正常。