2011-09-01 18 views
10

İstediğim şeyin doğru denetimini kullanmıyor olabilirim. Bir tabloyu kontrollerle dolduracağım ve her sütunun kendi içinde bulunan kontrollere otomatik olarak sığmasını istiyorum. Örneğin, bir metin kutusu sütunu, bir onay kutusu sütunundan daha geniş olacaktır. Farklı işletim sistemlerinin karmaşıklıkları, farklı DPI, farklı yazı tipleri vb. Nedeniyle yardımcı olabiliyorsam, ölçmek istemiyorum. Tablo, bir kaydırma çubuğuyla kontrollere uyacak şekilde yatay olarak genişleyebilir. Bu nasıl bir TableLayoutPanel ile mümkündür - veya başka bir kontrol?TableLayoutPanel boyutlandırma

Teşekkürler.

Düzenlendi eklemek için 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; 
     }*/ 
    } 

(Evet ağır üstlenmeden gerekiyor - Sadece ilk işe almaya çalışıyorum) bile, dışarı yorumladı bit sınırları istisnalar dışında neden

mantıklı olsa da (bana) yapmamalı. Aralık, çalışma zamanında değil, tasarım zamanında belirlediğim her şeyle sınırlı görünüyor.

+0

Kaç sütununuz var? – CharithJ

+0

Belirli bir sütunda yalnızca onay kutuları varsa, neden yeniden boyutlandırmaları gerekir? – CharithJ

+0

Sütunların dinamik olarak yeniden boyutlandırılması gerekmez, ancak denetimler eklendiğinde belirli bir boyuta ayarlanmalıdır. Şu anda otomatik boyutu kullanıyorum, yani tüm sütunlar aynı genişlikte. – GeoffM

cevap

15

Üzgünüz, ancak sütunların Otomatik Boyutlandırmaya ayarlanmış olmasıyla ilgili sorun nedir? TableLayoutPanel'in yaptığı, içindeki sütunları kontrol etmek için sütunları boyutlandırır. Tabloyu genişletmek ve bir kaydırma çubuğuna sahip olmak, Autodese özelliğini true olarak ayarlamak için tabloları ayarlamanızı, ardından TableLayoutPanel öğesini kaydırma çubuklarını etkinleştirilmiş başka bir panelde oturmanızı gerektirir. Gereksinimlerinizi yanlış anlamadığım sürece sütun boyutlandırması kutunun dışında çalışır.

Sadece emin olmak için, sütunlar özelliğine gidip her bir sütunun SizeType'ı Otomatik Boyutlandırmaya ayarlıyorsunuz değil mi? Sadece tablonun AutoSize özelliği değil mi?

enter image description here

İstediğin bu nedir?

-Post kodu: kodu için

teşekkürler. Bunu bir sürü yapmak için tasarımcı kullanmanı öneririm. En azından sütunları kurmak için, bunları otomatik boyutlara getirin ve başlık etiketlerini ekleyin.

Ayrıca Datagrid denetimini kontrol etmek ve konum listenize bağlamak isteyebilirsiniz.

1) nedeni, sütunlar kullandığınız başlık etiketleri Autosizing olmadığı için aynı boyutta bakmak:

bu yöntem olsa çalışma almak için. Hepsi x piksel genişliğinde ve bu sütunları esnetiyor.Bunu yapın: Ayrıca CheckBox denetimi ve içerik olarak eklediğiniz diğer etiketlere gerçek AutoSize özelliği ayarlamak gerekir

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

.

2) RowCount ve ColumnCount öğelerini ayarlamak RowStyles veya ColumnStyles koleksiyonunu etkilemez. 7 Sütununuz var, ancak sadece 2 Sütun Bilgisi var. Deneyin:

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)); 
} 

Sadece başka bir şey bazı kontroller satırlarda yanlış hizalanmış olacak olmasıdır için dışarı bakmak için (etiketler örneğin çok yüksek görünür). Bunu düzeltmek için Margin özelliğini, normal olarak metin kutuları ve onay kutularıyla hizalamak için 3,6,3,0'a ayarlayın.

+0

Evet, istediğim buydu . Ancak, genişlikleri ("GetPreferredWidth") nasıl hesapladığını okuduğumdan, bunu yapmamalı ... Belki de özellikleri doğru kombinasyonda ayarlamıyorum. Ancak, satırları ve sütunları ayarlama konusunda sorun yaşıyorum - yukarıda düzenlenmiş koduma bakın. – GeoffM

+0

DOH! Üstbilgi etiket genişlikleri, iyi lekeli! Ve cevabın geri kalanı da mantıklı. Teşekkürler. – GeoffM

0

Sen Sen ölçüm ile keman istemiyorum söylüyorlar ama eğer ... yeni denetimin genişliğini sütunun genişliğinden büyükse o zaman sütunu yeniden boyutlandırmak, ControlAdded olayını işlemek için

gerekir Yeniden boyutlandırıyorsun, mecbursun. Onay kutularının TextAlign'i hakkında daha dikkatli olursanız yazı tipleri ve buna dahil edilmemelidir ...

+0

Sütunların (ve satırların) otomatik olarak boyutlandırılabildiği HTML benzeri tablo işlevselliği umuyorum. Çalışmaktan çekiniyorum, Vista'yı söyle ve sonra Win7'deki sınırların 2px daha kalın olduğunu (veya temaları veya herhangi bir anahtar parametresini değiştirir) buluyorum. Sanırım kontrolün genişliğini ve yüksekliğini kullanmak yeterince güvenilir ise o zaman bunu kullanacağım. – GeoffM

+0

Kontrolün genişlikleri yeterince güvenilir olmalıdır. Winform uygulamalarını (diğer geliştiricilerinden, nasıl yapıldığından emin olmadığından emin değilim) Windows 7'de XP'den farklı bir şekilde görüntülediğimi söylemiştim, bu yüzden çalışacağını garanti edemiyorum :-) – andyhasit

0

Birden çok splitContainers'u başka bir panelin içinde kullanabilirsiniz. Ancak birçok yuvalanmış panel kullanmayın, this gibi sorunları yeniden boyutlandırabilir/yeniden çizebilirsiniz.

SplitContainer'u kullanmak istiyorsanız birçok örnek bulabilirsiniz.