2010-02-22 13 views
9

w jednym z moich formularzy datagridview wyświetla dane z bazy danych (oczywiście liczba danych (więc liczba wierszy) może się zmienić). Połączenie z bazą danych jest w zdarzeniu ładowania formularza. Po prostu nie mogę ustalić, jak wysokość całego datagridview jest autosynchronizowana, w zależności od liczby wyświetlanych wierszy.winforms: datagridview: height (autosize) w zależności od liczby wierszy

Odpowiedz

4

Jeśli ustawisz DataGridView.AutoSize == true, to podczas dodawania kolejnych wierszy siatka staje się dłuższa. W przeciwnym razie otrzymasz paski przewijania. Chyba, że ​​ustawiłeś ScrollBars == Null || Poziomy, w którym to przypadku rzędy po prostu znikają z końca.

Z jakiegoś powodu DataGridView.AutoSize można ustawić programowo. Obserwujemy też pewne dziwne zachowania, gdy umieszczasz siatkę w sterowniku, który można automatycznie analizować. Wygląda na to, że nie reaguje na rozmiar siatki.

Skończyło się na obliczeniu spodziewanego rozmiaru siatki z kolumny, wiersza, nagłówka, marginesu, dopełnienia i rozmiarów obramowania, a następnie zmianie rozmiaru kontrolki zawierającej siatkę i zakotwiczeniu siatki z czterech stron. Czułem się naprawdę niezgrabny, ale to najlepsze, co mogłem wymyślić. Jeśli nadal jesteś w pobliżu, skomentuj i zobaczę, czy mogę znaleźć kod, nie mam go pod ręką.

9

To co udało mi się znaleźć, i to działa dobrze do tej pory:

int GetDataGridViewHeight(DataGridView dataGridView) 
{ 
    var sum = (dataGridView.ColumnHeadersVisible ? dataGridView.ColumnHeadersHeight : 0) + 
       dataGridView.Rows.OfType<DataGridViewRow>().Where(r => r.Visible).Sum(r => r.Height); 

    return sum; 
} 

Dzięki temu ja zamknięte moje DataGridView w UserControl tak mogłaby wdrożyć autoSize poprawnie:

// This is in a user control where the datagrid is inside (Top docked) 
protected override void OnResize(EventArgs e) 
{ 
    if (AutoSize) 
    { 
     var height = this.GetDataGridViewHeight(this.dataBoxGridView); 
     this.dataBoxGridView.Height = height; 
     this.Height = height +this.Padding.Top + this.Padding.Bottom; 
    } 
} 

nie próbowałem (jeszcze) do budowy Custom Control bezpośrednio z DataGridView do wdrożenia tego.

+0

To zadziałało dla mnie, ale musiałem umieścić nawiasy okrągłe w górnej części przed znakiem +. Uważam, że jest to problem "porządku operacji" z operatorem? /: –

+0

Dobra uwaga. Dodałem nawiasy, aby rozróżnić wszelkie wątpliwości dotyczące tego trudnego precedensu operatora. – Larry

0

Tak to zrobiłem. aby ustawić wysokość DataGridView, możesz użyć jego właściwości Set Height. Przy ładowaniu formularza możesz użyć tego kodu, aby ukryć datagridview. dataGridViewName.Height = 0;

Następnie podczas pobierania wierszy z bazy danych. możemy użyć poniższej metody, aby uzyskać Wysokość datagridview zgodnie z liczbą wierszy.

Powiązane problemy