2010-04-20 3 views
2

Winform 응용 프로그램이 있는데 C#으로 작성하고 있습니다. 내 양식에는 TabControl이 7 페이지 (각각 TextBoxes 및 DropDownLists, 주로)로 가득 차 있습니다. DataReader를 사용하여 정보를 가져 와서 DataTable을 채우고 요소의 DataBindings.Add 메서드를 사용하여 해당 요소를 현재 값으로 채 웁니다.C# Winforms TabControl 요소가 TabPage가 선택 될 때까지 빈 상태로 읽음

사용자는 이러한 요소에 데이터를 입력하고 "저장"을 누른 다음 요소의 텍스트 필드를 사용하여 UPDATE 쿼리의 매개 변수를 설정할 수 있습니다. 예를 들어 :

updateCommand.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerName.Text; 

내가 가진 문제는 양식을로드하면 내가 수동으로 각 탭을 선택할 때까지, 모든 요소가 분명히 빈 간주한다는 것이다. 따라서 폼을로드 할 때 즉시 "저장"을 누르면 아직 선택하지 않은 TabPages의 모든 필드가 비어있는 데이터로 업데이트를 시도합니다. 각 TabPage를 선택하면 해당 요소가 올바르게 데이터를 전송하게됩니다. 당분간 나는 데이터가 처음으로 채워지는 경우 프로그래밍 방식으로 각 TabPage를 선택하는 (매우) 추악한 해결 방법을 찾아 냈지만 용납 할 수없는 장기적인 솔루션입니다.

제 질문은 TabPage에서 사용자가 TabPage를 선택하기 전에 데이터를 올바르게 반환하도록하려면 어떻게해야합니까?

+2

무슨 일이 일어나는지 잘 모르겠지만 컨트롤이 데이터 바인딩되면 컨트롤의 텍스트 필드가 아닌 BindingSource에서 값을 가져와야합니다. –

+0

BindingSource와 TabControl의 여러 탭을 사용할 때 똑같은 문제가 발생했습니다. – Tommassiov

답변

7

호가 정확합니다. 해당 TabPage가 선택 될 때까지 TabPage의 요소는 작성되지 않습니다. 각 TabPage 선택하는 폼로드시 루프를 추가하고 이제는 잘 작동합니다.

foreach (TabPage tp in tabControl1.TabPages) 
    { 
     page.Show(); 
    } 
+0

Genius. 내 인생이 훨씬 쉬워졌습니다. 단순성 ftw! – ImGreg

4

가능한지 확실하지 않습니다. 다음은 MSDN의 견적입니다.

"TabPage에 포함 된 컨트롤은 탭 페이지가 표시 될 때까지 만들어지지 않으며이 컨트롤의 데이터 바인딩은 탭 페이지가 표시 될 때까지 활성화되지 않습니다."

그러나 업데이트 코드에서 컨트롤의 값을 직접 가져 오는 대신 컨트롤을 채우는 데 사용하는 DataTable을 보유 할 수있는 클래스를 만든 다음 업데이트 코드가 호출되면 해당 클래스에 대해 값과 클래스는 컨트롤이로드되었는지 확인하고 그렇지 않으면 DataTable에서 값을 가져옵니다.

+1

답장을 보내 주셔서 감사합니다. 나는 당신이 옳다는 것을 알고, 페이지를 선택해야하며, TabControl을 기반으로 클래스를 만들고 싶습니다. 이제 폼로드시 TabPages를 반복하는 것이 더 쉽다고 생각합니다. –

1

문제는 탭이 표시 될 때까지 컨트롤이 만들어지지 않는다는 것입니다. 이 솔루션은에 의존

public Form() 
{ 
    CreateControls(this.tabPage1); 
} 

: 당신이 뭔가를 할 것, 그리고

private static void CreateControls(Control control) 
{ 
    CreateControl(control); 
    foreach (Control subcontrol in control.Controls) 
    { 
     CreateControl(subcontrol); 
    } 
} 
private static void CreateControl(Control control) 
{ 
    var method = control.GetType().GetMethod("CreateControl", BindingFlags.Instance | BindingFlags.NonPublic); 
    var parameters = method.GetParameters(); 
    method.Invoke(control, new object[] { true }); 
} 

를 생성자에서 양식에 : 하나의 해결책은 사실과 같이 페이지를로드 컨트롤을 생성하는 것입니다 내부 CreateControls 메서드가 있다는 사실은 보이지 않더라도 컨트롤을 만들 수있는 단일 부울 매개 변수를 사용합니다.

0

이 문제의 대안은 양식로드 이벤트에 다음 코드를 추가하는 것이 었습니다.

this.tabcontrol1.BindingContext = this.BindingContext;