Wypełniam formant DataGridView w formularzu systemu Windows (C # 2,0 nie WPF).
Moim celem jest wyświetlenie siatki, która starannie wypełnia całą dostępną szerokość komórkami - tj. Żadnych nieużywanych (ciemnoszarych) obszarów po prawej stronie i odpowiednio dopasowuje rozmiar każdej kolumny zgodnie z zawartymi w niej danymi, ale także umożliwia użytkownikowi zmianę rozmiaru dowolnej kolumny według ich upodobań.
Próbuję to osiągnąć, ustawiając AutoSizeMode każdej kolumny na DataGridViewAutoSizeColumnMode.AllCells, z wyjątkiem jednej z kolumn, które ustawiłem na DataGridViewAutoSizeColumnMode.Fill , aby upewnić się, że cały obszar siatki jest starannie wypełniony danymi. (Nie mam nic przeciwko temu, że gdy użytkownik próbuje zmienić rozmiar tej kolumny, wraca do rozmiaru, który zapewnia, że przestrzeń pozioma jest zawsze używana.)
Jednak, jak wspomniałem, po załadowaniu chciałbym pozwolić użytkownikowi na zmianę rozmiaru kolumn, aby dopasować je do własnych wymagań - ustawiając te wartości AutoSizeMode dla każdej kolumny, wydaje się, że użytkownik nie może wtedy zmienić rozmiaru tych kolumn.
Próbowałem nie ustawiać AutoSizeMode wszystkich kolumn, co pozwala na zmianę rozmiaru, ALE nie ustawia rozmiaru początkowego zgodnie z danymi, które zawierają komórki. Ten sam wynik występuje w przypadku zmiany AutoSizeMode siatki z powrotem na „Not Set” po załadowaniu danych.
Czy brakuje mi ustawienia, które umożliwia automatyczne ustawianie domyślnych szerokości kolumn ORAZ zmianę rozmiaru użytkownika, czy też istnieje inna technika, której muszę użyć podczas wypełniania kontrolki DataGridView?
źródło
Odpowiedzi:
Ta sztuczka działa dla mnie:
To, co się tutaj dzieje, polega na tym, że ustawiasz autodopasowanie na dowolny tryb, którego potrzebujesz, a następnie kolumna po kolumnie przechowujesz szerokość uzyskaną z automatycznego obliczania rozmiaru, usuwasz automatyczne dostosowywanie i ustawiasz szerokość na wartość, którą wcześniej zapisałeś.
źródło
grd.Columns(i).Width = grd.Columns(i).Width
już wystarczy. Zobacz tutaj .dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
Może mógłbyś zadzwonić
Po ustawieniu źródła danych. Ustawi szerokość i pozwoli na zmianę rozmiaru.
Więcej o metodzie MSDN DataGridView.AutoResizeColumns (DataGridViewAutoSizeColumnsMode) .
źródło
DataGridViewAutoSizeColumnsMode.DisplayedCells
. Ponadto w Projektancie formularzy AutoSizeColumnsMode jest ustawiona na None. Musiałem wykonać to wywołanie metody w programie obsługi zdarzeń DataBindingComplete w DataGridView, aby upewnić się, że zawsze (ponownie) rozmiary są prawidłowe.Wersja AC # kodu Miroslava Zadraveca
Opublikowane jako Wiki społeczności, aby nie osłabiać reputacji innych
źródło
W mojej aplikacji ustawiłem
Ustawiłem również
Teraz można zmieniać szerokości kolumn i przestawiać kolumny przez użytkownika. U mnie to działa całkiem nieźle.
Może to zadziała dla Ciebie.
źródło
Po dodaniu danych do siatki dodaj poniższy kod, który dostosuje kolumnę zgodnie z długością danych w każdej komórce
Oto wynik
źródło
Cóż, zrobiłem to tak:
w tej kolejności. Rozmiar kolumn jest zmieniany (rozszerzany) ORAZ użytkownik może później zmienić rozmiar kolumn.
źródło
Jeśli dobrze zrozumiałem pytanie, powinien być łatwiejszy sposób na osiągnięcie tego, czego potrzebujesz. Połączenie
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
To powinno załatwić sprawę. Istnieje jednak jedna pułapka, ponieważ nie można po prostu wywołać tej metody bezpośrednio po wypełnieniu kontrolki DataGridView. Zamiast tego będziesz musiał dodać EventHandler dla zdarzenia VisibleChanged i wywołać tam metodę.
źródło
U mnie działają proste dwie linie kodu.
źródło
Wznów pytanie:
dostosuj szerokość kolumny do treści (inną metodą w całej kolumnie),
ale następnie pozwól użytkownikowi ustawić szerokość kolumny ...
Rozwijanie od odpowiedzi Miroslav Zadravec jest dla mnie to, co działało natychmiast za pomocą automatycznego komputerowej
column.Width
do zestawu ...column.Width
!To jest testowany do pracy, gdy
DataGridView
jest już utworzony, stosując trick jak ten .źródło
Zrobiło to dla mnie cuda:
źródło
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Spowoduje to automatyczne dopasowanie wszystkich kolumn zgodnie z ich zawartością, wypełnienie pozostałej pustej przestrzeni przez rozciągnięcie określonej kolumny i zapobiegnie zachowaniu „przeskakiwania”, ustawiając ostatnią kolumnę do wypełnienia w celu przyszłej zmiany rozmiaru.
źródło
Nieco schludniejszy kod C # z kodu Miroslava Zadraveca, przy założeniu, że wszystkie kolumny mają być automatycznie zmieniane
źródło
Kolejna wersja kodu Miroslava Zadraveca, ale nieco bardziej zautomatyzowana i uniwersalna:
Drugą część umieszczam w osobnym zdarzeniu, ponieważ wypełniam
datagridvew
inicjalizację formularza i jeśli są obie części to nic się nie zmienia, ponieważ prawdopodobnie autosize oblicza szerokości podatagridview
wyświetleniu, więc szerokości są nadal domyślne wForm1()
metodzie. Po skończeniu tej metody autosize robi swoje i zaraz po tym (po wyświetleniu formularza) możemy ustawić szerokości według drugiej części kodu (tutaj wForm1Shown
przypadku). To działa na mnie jak urok.źródło
Oto uproszczony kod odpowiedzi Miroslava Zadraveca w języku C #:
źródło
Czy próbowałeś ustawić
FillWeight
własność swojegoDataGridViewColumns
obiektu?Na przykład:
Myślę, że to powinno działać w twoim przypadku.
źródło
Małe ulepszenie w stosunku do wersji Schnapple
źródło
dataGridView1.AutoResizeColumns ();
źródło
Szerokości kolumn ustawione tak, aby pasowały do jej zawartości, użyłem poniższego stwierdzenia: To rozwiązało mój problem.
Pierwszy krok :
Drugi krok :
Trzeci krok :
źródło
Powinno to działać niezależnie od tego, czy
dataGridView
został wyświetlony, czy nie (tj. Nawet jeśli został wywołany z konstruktora klasy).Ta sama metoda, ale z
DataGridViewAutoSizeColumnMode.DisplayedCells
, zawodzi w powyższym przypadku z oczywistego powodu - żadna komórka nie została jeszcze wyświetlona! Z jakiegoś nieoczywistego powoduAutoResizeColumns
również zawodzi w tym przypadku.źródło
Jeśli na przykład powiążesz swoje źródło danych z plikiem danych, musisz ustawić właściwości po wykonaniu powiązania:
źródło
DataGridView.Columns
, zmieńAutoSizeMode
na prawidłową, zbierz wartość szerokości i ustaw ją ponownie po zmianieAutoSizeMode
naDataGridViewAutoSizeColumnMode.None
).Form.Show()
lubForm.ShowDialog()
. Więc umieściłem ten fragment kodu wForm.Shown
zdarzeniu i to działa dla mnie.Mój przekształcony kod, niezależnie od tego, co
DataGridView.AutoSizeColumnsMode
ustawiono wcześniej, używamDataGridViewColumn.GetPreferredWidth()
zamiast zmieniaćDataGridViewColumn.AutoSizeMode
i natychmiast ustawiam wartość szerokości, a potem zmieniamDataGridView.AutoSizeColumnsMode
raz:Pamiętaj, aby ustawić
Nie wiem, dlaczego to działa dopiero po wyświetleniu formularza.
źródło
Musiałem to zrobić w VB i wolę podzielić to na metodę, którą umieściłem w Module. W razie potrzeby możesz dodać kolumnę Fill jako kolejny parametr ByRef.
źródło
Możesz zrobić coś takiego:
Wszystkie kolumny dostosują się do treści, z wyjątkiem ostatniej, która wypełni siatkę.
źródło
Gdy $ array jest zawartością PSCustomObject, działa to:
źródło