2012-07-26 8 views
5

Mam DataGridView który wyświetla ograniczoną liczbę wierszy, nie więcej niż 5. To DataGridView jest umieszczony na kontrolę DataRepeater więc to zwykle wyświetlane wiele razy na ekranie. Co chcę osiągnąć, to to, że wszystkie siatki są przeskalowane do rozmiaru ich zawartości, więc nie wyświetlają pasków przewijania, jeśli są w nich 4 lub 5 elementów lub zajmują dodatkowe pionowe pole, jeśli jest tylko 1 lub 2 elementy.Jak pionowo rozmiar Auto kontrolę WinForm DataGridView tak, że jego wiersze są zawsze widoczne

Siatki zawierają tylko dane tekstowe. Są to kontrolki powiązane z danymi, więc będą musiały zmienić rozmiar, jeśli zmienia się źródło danych źródłowych (wydaje mi się, że odpowiednie byłoby zdarzenie DataBindingComplete).

Jak mogę to osiągnąć? Czy liczenie wierszy jest najlepszą opcją? Z góry dziękuję.

+0

Oto dokładniejsza odpowiedź [DataGridView Auto Wysokość? - Jak autoSize DataGridView wysokość] (http://stackoverflow.com/questions/38816425/datagridview-auto-height-how-to-autosize-datagridview -wysokość) –

Odpowiedz

13

Od kontrolą jest powiązane z danymi, chciałbym ustawić właściwość Height na DataGridView do sumy wysokości swoich wierszy (plus pewien margines) w przypadku DataBindingComplete:

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    var height = 40; 
    foreach (DataGridViewRow dr in dataGridView1.Rows) { 
     height += dr.Height; 
    } 

    dataGridView1.Height = height; 
} 
0

wartość ta może być cokolwiek. Powinieneś przetestować w swojej siatce, aby odkryć, jaka jest najlepsza wartość do ustawienia wysokości.

var height = 40; 

Zmieniano:

Aby znaleźć prawdziwe wartości do wysokości, trzeba dodać lokalizację sieci i wysokości nagłówka. Coś w tym stylu.

int height = dgv.Location.Y + dgv.ColumnHeadersHeight; 
foreach (DataGridViewRow dr in dgv.Rows) { 
    height += dr.Height; // Row height. 
} 
dgv.Height = height; 
0

Wziąłem odpowiedź hmqcnoesy i rozszerzyłem na nią i stworzył funkcję, aby również uwzględnić szerokość. I do użycia na dowolnej siatce.

Uwaga: Ustaw AutoSizeCells = AllCells na siatce.

public static DataGridView SetGridHeightWidth(DataGridView grd, int maxHeight, int maxWidth) 
    { 
     var height = 40; 
     foreach (DataGridViewRow row in grd.Rows) 
     { 
      if(row.Visible) 
       height += row.Height; 
     } 

     if (height > maxHeight) 
      height = maxHeight; 

     grd.Height = height; 

     var width = 60; 
     foreach (DataGridViewColumn col in grd.Columns) 
     { 
      if (col.Visible) 
       width += col.Width; 
     } 

     if (width > maxWidth) 
      width = maxWidth; 

     grd.Width = width; 

     return grd; 
    } 
Powiązane problemy