2011-09-01 14 views
10

Możliwe, że nie używam odpowiedniego elementu sterującego do tego, co chcę. Wypełniam tabelę kontrolkami i chcę, aby każda kolumna automatycznie dopasowywała się do kontrolek w niej zawartych. Na przykład kolumna pól tekstowych będzie szersza niż kolumna pól wyboru. Nie chcę się bawić przy pomiarze, jeśli mogę pomóc, ze względu na złożoność różnych systemów operacyjnych, różnych DPI, różnych czcionek itp. Tabela może się rozciągać poziomo w celu dopasowania do elementów sterujących za pomocą paska przewijania. Jak to jest możliwe z TableLayoutPanel - lub inną formant?Rozmiar tabeli TableLayoutPanel

Dzięki.

Edited by dodać kod:

private void UpdateLocations() 
    { 
     tableLayoutPanel1.RowCount = CurrentSchedule.location.Length + 1; 
     tableLayoutPanel1.ColumnCount = 7; 
     int row = 1; 
     int timeWidth = TextRenderer.MeasureText("00:00:00x", tableLayoutPanel1.Font).Width; 

     Label lab = new Label(); 
     lab.Text = "Location"; 
     tableLayoutPanel1.Controls.Add(lab, 0, 0); 

     lab = new Label(); 
     lab.Text = "Arrive"; 
     tableLayoutPanel1.Controls.Add(lab, 1, 0); 

     lab = new Label(); 
     lab.Text = "Depart"; 
     tableLayoutPanel1.Controls.Add(lab, 2, 0); 

     lab = new Label(); 
     lab.Text = "Pass?"; 
     tableLayoutPanel1.Controls.Add(lab, 3, 0); 

     lab = new Label(); 
     lab.Text = "Path"; 
     tableLayoutPanel1.Controls.Add(lab, 4, 0); 

     lab = new Label(); 
     lab.Text = "Plat"; 
     tableLayoutPanel1.Controls.Add(lab, 5, 0); 

     lab = new Label(); 
     lab.Text = "Line"; 
     tableLayoutPanel1.Controls.Add(lab, 6, 0); 

     foreach (location loc in CurrentSchedule.location) 
     { 
      TextBox tb = new TextBox(); 
      tb.Text = loc.locationID; 
      tableLayoutPanel1.Controls.Add(tb, 0, row); 

      tb = new TextBox(); 
      tb.Text = loc.arrivalTime; 
      tb.Width = timeWidth; 
      tableLayoutPanel1.Controls.Add(tb, 1, row); 

      tb = new TextBox(); 
      tb.Text = loc.departureTime; 
      tb.Width = timeWidth; 
      tableLayoutPanel1.Controls.Add(tb, 2, row); 

      CheckBox cb = new CheckBox(); 
      cb.Checked = loc.passingTime; 
      tableLayoutPanel1.Controls.Add(cb, 3, row); 

      tb = new TextBox(); 
      tb.Text = loc.pathCode; 
      tableLayoutPanel1.Controls.Add(tb, 4, row); 

      tb = new TextBox(); 
      tb.Text = loc.platformCode; 
      tableLayoutPanel1.Controls.Add(tb, 5, row); 

      tb = new TextBox(); 
      tb.Text = loc.lineCode; 
      tableLayoutPanel1.Controls.Add(tb, 6, row); 

      row++; 
     } 
     /*for (int idx = 0; idx < tableLayoutPanel1.RowCount; idx++) 
     { 
      tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize; 
     } 
     for (int idx = 0; idx < tableLayoutPanel1.ColumnCount; idx++) 
     { 
      tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize; 
     }*/ 
    } 

(Tak musi ciężki refaktoryzacji - Po prostu staram się zmusić go do pracy pierwszy)

zakomentowanym bity powodować poza granicami wyjątkami, nawet choć logicznie (do mnie) nie powinno. Zakres wydaje się ograniczony do tego, co ustawiłem w czasie projektowania, a nie w czasie wykonywania.

+0

Ile kolumn masz? – CharithJ

+0

Jeśli w danej kolumnie występują tylko pola wyboru, dlaczego konieczna jest zmiana rozmiaru? – CharithJ

+0

Kolumny nie muszą dynamicznie zmieniać rozmiaru, ale ustawione na konkretny rozmiar po dodaniu elementów sterujących. W tej chwili używam rozmiaru automatycznego, co oznacza, że ​​wszystkie kolumny mają tę samą szerokość. – GeoffM

Odpowiedz

15

Niestety, ale co jest nie tak z ustawieniem kolumn na Autosize? To właśnie robi TableLayoutPanel, kolumny wielkości dopasowują do kontrolek w nim. Rozwijanie tabeli i posiadanie paska przewijania wymagałoby ustawienia właściwości Autosize dla wartości true, a następnie ustawienia TableLayoutPanel w innym panelu z włączonymi paskami przewijania. Ale rozmiar kolumny powinien działać po wyjęciu z pudełka, chyba że nie rozumiem twoich wymagań.

Aby się upewnić, że przechodzisz do właściwości columns i ustawiasz SizeType każdej kolumny na AutoSize right? Nie tylko właściwość AutoSize samej tabeli?

enter image description here

jest to czego chcesz?

-P kod pocztowy:

Dzięki za kod. Sugerowałbym, żebyś używał projektanta, żeby zrobić to bardzo dużo. Przynajmniej aby ustawić kolumny, ustaw je na autosize i dodaj etykiety nagłówków.

Możesz również chcieć sprawdzić formant DataGrid i powiązać go z listą lokalizacji.

Aby metoda ta działa jednak:

1) powód twoje kolumny wyglądają tak samo, ponieważ jest rozmiar etykiety nagłówek których używasz nie są autosizing. Wszystkie mają szerokość x pikseli i to rozciąganie kolumn.Wykonaj:

Label lab = new Label(); 
lab.AutoSize = true; 
lab.Text = "Location"; 
tableLayoutPanel1.Controls.Add(lab, 0, 0); 

Będziesz również trzeba ustawić właściwość autoSize true sprawie kontroli wyboru i wszelkich innych etykiet dodawanych jako treść.

2) Ustawienie RowCount i ColumnCount nie wpłynie na kolekcję RowStyles lub ColumnStyles. Masz 7 Kolumn, ale tylko 2 Kolumnowe. Spróbuj:

tableLayoutPanel1.ColumnStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++) 
{ 
    tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); 
} 

tableLayoutPanel1.RowStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.RowCount; i++) 
{ 
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
} 

Jedyne co należy zwrócić uwagę jest to, że niektóre kontrole zostaną przesunięte w rzędach (etykiety wydają się zbyt wysokie dla przykładu). Aby to naprawić, ustaw właściwość Margines, zwykle na 3,6,3,0, aby dopasować je do pól tekstowych i pól wyboru itp.

+0

Tak, właśnie tego chcę . Ale z tego, co przeczytałem o tym, jak oblicza szerokości ("GetPreferredWidth"), nie powinien tego robić ... Może nie ustawiam właściwości we właściwej kombinacji. Mam jednak problemy z ustawianiem wierszy i kolumn - zobacz mój edytowany kod powyżej. – GeoffM

+0

DOH! Szerokość etykiet nagłówka, dobrze zauważona! A reszta odpowiedzi ma sens. Dzięki. – GeoffM

0

Musisz obsłużyć zdarzenia ControlAdded, a następnie zmienić rozmiar kolumny, jeśli szerokość nowego formantu jest większa niż szerokość kolumny ...

Mówisz, że nie chcesz bawić się z pomiaru, ale jeśli zmieniasz rozmiar, musisz to zrobić. Czcionki i inne elementy nie powinny się do nich włączać, jeśli zachowasz ostrożność w ustawieniach pola tekstowego w polach wyboru itp.

+0

Miałem nadzieję na funkcjonalność podobną do HTML, w której kolumny (i wiersze) mogą być automatycznie wymiarowane. Obawiam się, że muszę nad tym popracować, powiedzmy, Vista, a potem odkryć, że granice w Win7 są grubsze o 2px (lub motywy, czy jakakolwiek zmienna kluczowe parametry). Sądzę, że jeśli po prostu użycie szerokości i wysokości kontrolki będzie wystarczająco wiarygodne, wykorzystam to. – GeoffM

+0

Szerokość kontrolek powinna być wystarczająco wiarygodna. Powiedziawszy, że widziałem aplikacje WinForm (od innych programistów, więc nie jestem pewien jak to wszystko zostało wykonane) wyświetlają się inaczej w Windows 7 niż w XP, więc nie gwarantuję, że to zadziała :-) – andyhasit

0

Możesz użyć wielu numerów splitContainers w panelu innego użytkownika. Ale nie używaj wielu zagnieżdżonych paneli, możesz uzyskać problemy z rozmiarem/przerysowaniem, takie jak this.

Możesz znaleźć wiele przykładów, jeśli chcesz użyć SplitContainer.

Powiązane problemy