2013-07-18 11 views
7

Zastanawiam się, czy jest możliwe, aby kolumna datgridview automatycznie dostosować jej szerokość do zawartości i jednocześnie jest zmieniany przez użytkownika?DataGridView kolumna automatycznie dostosowuje szerokość i zmienia rozmiar

Oto co próbowałem dotąd:

dataGridView.AllowUserToResizeColumns = true; 
dataGridView.Columns[0].AutoSizeMode=DataGridViewAutoSizeColumnMode.DisplayedCells; 
dataGridView.Columns[0].Resizable = DataGridViewTriState.True; 

ale nadal jestem w stanie ręcznie zmienić rozmiar rozmiar kolumny.

Jeśli ktoś już napotkał ten problem lub ma jakiś pomysł, daj mi znać.

Dzięki.

+0

nie są kolumny "DataGridView" skalowalne domyślnie? Co stanie się, gdy usuniesz cały ten kod? Czy możesz zmienić ich rozmiar? – Axarydax

+0

Tak kolumny są zmieniane. Mam inne kolumny w moim datagrid, które są resizable. Ale jak tylko ustawię AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells na kolumnę, tej konkretnej kolumny nie można już zmienić, podczas gdy inne są. – wallou

Odpowiedz

16

W końcu znalazłem sposób, aby zrobić to, co chciałem.

Ideą jest

  • niech dataGridView sama zmiana rozmiaru kolumny, aby dopasować zawartość, a następnie
  • zmienić AutoSizeColumnMode i ustawić szerokość z wartością po prostu przechowywane.

Oto kod:

dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; 
int widthCol = dataGridView.Columns[i].Width; 
dataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; 
dataGridView.Columns[i].Width = widthCol; 

nadzieję, że pomoże.

2

Opierając się na powyższym kodzie iteracyjne go wszystkich kolumn a także auto dostosować szerokość DataGridView

//initiate a counter 
int totalWidth = 0; 

//Auto Resize the columns to fit the data 
foreach (DataGridViewColumn column in mydataGridView.Columns) 
{ 
    mydataGridView.Columns[column.Index].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; 
    int widthCol = mydataGridView.Columns[column.Index].Width; 
    mydataGridView.Columns[column.Index].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; 
    mydataGridView.Columns[column.Index].Width = widthCol; 
    totalWidth = totalWidth + widthCol; 
} 
//the selector on the left of the DataGridView is about 45 in width 
mydataGridView.Width = totalWidth + 45; 
0

Rzecz, która nie jest oczywista (nie było mnie) jest to, że wykorzystanie AutoSizeMode oznacza, że ​​chcemy zarządzać rozmiarem, co oznacza, że ​​użytkownik nie może (nie może) wykonać zmiany rozmiaru. Więc to, co próbowałem i wydaje się działać, to używać DataGridView.AutoResizeColumn (zauważ, że robi to jednorazowa zmiana rozmiaru) dla każdej kolumny lub większości kolumn, a następnie ustawić DataGridView.AllowUserToResizeColumns na true. Prawdopodobnie istnieją inne warianty, ale ważne jest to, że użycie AutoSizeMode wyklucza się wzajemnie, umożliwiając użytkownikowi zmianę rozmiaru.

0
  • Dzięki za rozwiązanie wyżej (do iterację DataGridView.Columns zmień AutoSizeMode do jednego ważnego, zbieranie wartości szerokości i ustawić ją z powrotem po zmianie AutoSizeMode do DataGridViewAutoSizeColumnMode.None).
  • Zmagałem się z tym i zauważyłem, że nie zadziała, gdy zostanie wywołane z konstruktora klasy lub dowolnej linii przed Form.Show() lub Form.ShowDialog(). Dlatego umieszczam ten fragment kodu w zdarzeniu Form.Shown i działa to dla mnie.
  • Mój przekształcony kodu, niezależnie od reguardless DataGridView.AutoSizeColumnsMode ustawione wcześniej, używam DataGridViewColumn.GetPreferredWidth() zamiast zmieniać DataGridViewColumn.AutoSizeMode i natychmiast ustawić wartość szerokości, a następnie zmienić DataGridView.AutoSizeColumnsMode raz:

    private void form_Shown(object sender, EventArgs e) 
    { 
         foreach (DataGridViewColumn c in dataGridView.Columns) 
          c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.DisplayedCells, true); 
         dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; 
    } 
    
  • Pamiętaj, aby ustawić

     dataGridView.AllowUserToResizeColumns = true; 
    
  • Nie wiem, dlaczego to działa tylko po wyświetleniu formularza.

0

można po prostu użyć tego prostego kodu:

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells); 

Po ustawieniu źródła danych. Ustawi szerokość i pozwoli zmienić rozmiar.

Powiązane problemy