2009-05-22 2 views
0

기본 제공 .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

나는 행동을 재현 할 수는 없지만 (특별한 상황이 필요한 것처럼 당신의 설명에서 나는 소리를 낸다.) 호기심에서 벗어난다. DropDown 이벤트 처리기 (및 해당 처리기를 실행하는 동안 콤보 상자에 액세스하는 다른 코드)의 코드를 우리와 공유 할 수 있습니까? –

+0

ComboBox의 LostFocus 이벤트에 중단 점을 넣고 호출을 시작한 StackTrace를 검사 할 수 있습니다. 이것은 좀 더 통찰력을 제공 할 수 있습니다. –

답변

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 

: 상자가 너무 같이 체크 될 때 용액 명시 콤보 박스에 포커스를 설정하는 것이었다.

관련 문제