在选项卡控件上时,组合框下拉菜单意外关闭

时间:2009-05-22 18:36:43

标签: .net vb.net winforms

我有一个带有内置.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

1 个答案:

答案 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

然后,组合框的下拉部分显示正常。