2012-02-29 5 views
1

저는 C#을 처음 사용 합니다만, Google이 나에게 대답하지 못했다는 문제를 발견했습니다.C# 동적으로 생성 된 탭의 컨트롤에서 정보 가져 오기

내 코드에서는 사용자 입력을 기반으로 TabControl에서 TabPage를 만들 수 있습니다. (예 : 5 개 항목을 원한다면 내 코드는 모두 자신의 컨트롤 (ComboBoxes)을 사용하여 5 개의 탭을 만듭니다.

내 문제는 이러한 콤보 상자에서 데이터를 받고 있습니다. 내가 만든 각 '항목'(TabPage)에 대해 각 콤보 상자에서 선택한 데이터를 가져올 수 있어야합니다. 그것들은 동적으로 생성되었으므로 'comboBox1'이 내가 만든 마지막 TabPage 만 참조하기 때문에 TabControl.TabPages [n] .comboBox1.SelectedItem.ToString()과 같이 직접 참조 할 수 없습니다.

읽어 주셔서 감사합니다.

+1

일부 코드를 볼 수 있다면 더 좋을 것입니다. – arunes

답변

0

빠르고 쉬운 해결책은 다음과 같이 목록에있는 콤보를 넣어하는 것입니다 :

int tabCount = 5; 
    tabControl.TabPages.Clear(); 

    List<ComboBox> comboboxes = new List<ComboBox>(tabCount); 
    for (int i = 0; i < tabCount; i++) 
    { 
     TabPage tabPage = new TabPage(); 
     ComboBox comboBox = new ComboBox(); 
     comboboxes.Add(comboBox); 
     tabPage.Controls.Add(comboBox); 
     tabControl.TabPages.Add(tabPage); 
    } 

    // You can access the values using the 'comboboxes' list now. 

더 나은 (그러나 더 복잡한) 솔루션은 데이터 모델을 구현하고이에 콤보를 결합하는 것 모델. 이렇게하면 값을 나타내는 구체적인 컨트롤 (예 : TabPage, ComboBox 등)에 신경 쓰지 않아도됩니다.

+0

이 작업은 효과가 있지만 이제 탭 목록을 메모리에 보관해야합니다. – mozillanerd

0

각 탭에서 ComboBox의 이름을 동일하게 지정 했으므로 이름 지정 컨테이너로 탭 컨테이너를 지정하고 탭을 참조한 다음 FindControl을 사용하여 ComboBox를 찾는 것이 좋습니다. 탭을 나타내는 클래스는 INamingContainer를 구현해야합니다. 이렇게하면 탭 내의 모든 컨트롤의 컨트롤 ID 앞에 이름 지정 컨테이너의 ID가 붙습니다. 다음은 명명 컨테이너의 예입니다. http://www.robertsindall.co.uk/blog/using-inamingcontainer-in-controls/

관련 문제