Jak sprawić, by kolumny XAML DataGridColumns wypełniały cały DataGrid?


117

Używam DataGrids w XAML (nie Silverlight) z kolumnami o zmiennym rozmiarze, DataGrid rozwinie się, jeśli użytkownik zmieni rozmiar ekranu.

Obecnie, jeśli szerokości wszystkich kolumn DataGrid są mniejsze niż szerokość DataGrid, pojawia się dodatkowa „kolumna”, której nie można kliknąć i która nie służy żadnemu celowi.

Czy ktoś wie, jak sprawić, aby jedna kolumna zawsze zmieniała rozmiar, aby wypełnić całą pozostałą przestrzeń?

Odpowiedzi:


248

Jeśli użyjesz Width="*"kolumny wypełni się, aby rozszerzyć dostępną przestrzeń.

Jeśli chcesz, aby wszystkie kolumny dzieliły siatkę równo, zastosuj to do wszystkich kolumn. Jeśli chcesz, aby jeden wypełnił pozostałą przestrzeń, po prostu zastosuj go do tej kolumny, a reszta to „Auto” lub określona szerokość.

Możesz również użyć Width="0.25*"(na przykład), jeśli chcesz, aby kolumna zajmowała 1/4 dostępnej szerokości.


2
i jak zrobić coś podobnego, jeśli używam AutoGenerateColumns="True"?
javapowered

1
@javapowered - proponuję zadać własne pytanie, odwołując się do tego.
ChrisF

16
@javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Xavier

11
@MohamedSakherSawan to rzeczywiście działa dla datagrid. Zarówno ColumnWidth="*"w DataGrid, jak i Width="*"na poszczególnych kolumnach dają pożądany efekt
Steve

1
Daje błąd Sting nie może być przekonwertowany na „*”
co2f2e

18

Upewnij się, że DataGrid jest Widthustawiony na coś takiego jak {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

W ten sposób twoje ustawienie Width="*"atrybutu na DataGrid.Columns/DataGridXXXXColumnelementach powinno działać.


9

Jak wspomniano, ColumnWidth="*"działał doskonale w przypadku DataGrid w XAML.

Użyłem go w tym kontekście:

<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

7

Ustaw Widthwłaściwość kolumny na proporcjonalną szerokość, taką jak*


3

Mój 2 Cent ->

Bardzo późno na imprezę

DataGrid -> Column -> Width = "*" działa tylko wtedy, gdy kontener nadrzędny DataGrid ma stałą szerokość.

przykład: umieściłem DataGrid w Siatka -> Kolumna, której szerokość = "Auto", a następnie Szerokość = "*" w DataGrid nie działa, ale jeśli ustawisz Siatka -> Szerokość kolumny = "450" ​​oznacza naprawioną, to działa dobrze


2

Kolejny spin na ten sam temat:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    dataGrid.Width = e.NewSize.Width - (e.NewSize.Width * .1);

    foreach (var column in dataGrid.Columns)
    {
       column.Width = dataGrid.Width / dataGrid.Columns.Count;
    }
 }

1

Dodałem HorizontalAlignment = "Center" (wartość domyślna to "Strech") i rozwiązało to mój problem, ponieważ sprawiło, że datagrid był tak szeroki, jak potrzeba. (Usunięto ustawienie szerokości datagridu, jeśli je posiadasz).

wprowadź opis obrazu tutaj


W połączeniu z wybraną odpowiedzią i ta rozwiązała problem za mnie. Musiałem usunąć szerokość w samym Datagridzie. Dzięki.
Bryan Harrington,

0

Nie spowoduje to rozszerzenia ostatniej kolumny siatki XAML, aby zająć pozostałą przestrzeń, jeśli AutoGeneratedColumns="True".


Usunąłem AutoGenerateColumns, mimo że kolumny nie są podzielone ani rozciągnięte na całą szerokość siatki danych / ekranu. Mam odpowiedni wiersz siatki, który ma być „*”, a szerokość kolumn nie ma określonej szerokości (ani „auto”, ani „pewna wartość”). Ale nadal mam problemy, oto kod XAML
GK

0

ustaw JEDNĄ szerokość kolumny na dowolną wartość, tj. width = "*"


0

Dla tych, którzy szukają obejścia w języku C #:

Jeśli z jakiegoś powodu chcesz włączyć opcję „AutoGeneratedColumns”, jedną rzeczą, którą możesz zrobić, jest określenie szerokości wszystkich kolumn z wyjątkiem tych, których rozmiar ma być automatycznie zmieniany ( nie zajmie to pozostałego miejsca , ale rozmiar zostanie zmieniony na zawartość komórki ).

Przykład (dgShopppingCart to moja DataGrid):

dgShoppingCart.Columns[0].Visibility = Visibility.Hidden; 
dgShoppingCart.Columns[1].Header = "Qty";
dgShoppingCart.Columns[1].Width = 100;
dgShoppingCart.Columns[2].Header = "Product Name"; /*This will be resized to cell content*/
dgShoppingCart.Columns[3].Header = "Price";
dgShoppingCart.Columns[3].Width = 100;
dgShoppingCart.Columns[4].Visibility = Visibility.Hidden; 

Dla mnie działa to jako obejście, ponieważ potrzebowałem zmienić rozmiar DataGrid, gdy użytkownik zmaksymalizował okno.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.