代码之家  ›  专栏  ›  技术社区  ›  Chris Tybur

组合框下拉列表在选项卡控件上意外关闭

  •  0
  • Chris Tybur  · 技术社区  · 15 年前

    我有一个带有内置.NET 2.0选项卡控件单个实例的模式窗体。选项卡控件有多个页面,其中一个页面上有一个组合框,直到用户第一次激活它时才会填充该组合框。当发生这种情况时,我处理下拉事件并运行一个需要几秒钟的进程,然后将该进程返回的项添加到组合框中。

    它工作得很好,除了下拉组合框的列表部分之后,它会立即关闭,就像其他控件获得焦点一样。我把范围缩小到窗体上有一个选项卡控件,并且检索组合框项的过程需要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 回复  |  直到 15 年前
        1
  •  0
  •   Chris Tybur    15 年前

    我能解决这个问题。

    我首先在组合框的LostFocus事件中添加了一个断点,并根据SteveDignan的建议查看了堆栈跟踪,但这并没有显示任何内容。我的表单有一点特别,那就是这个组合框通常是禁用的,只有当用户选中同一个选项卡页上的一个框时才会启用。解决方案是在复选框时显式地将焦点设置为组合框,如下所示:

    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
    

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