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ń?

Purplegoldfish
źródło

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.

ChrisF
źródło
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ć.

MStack
źródło
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}" />
PeripherySilence
źródło
7

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

devdigital
źródło
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

Muhammad Waqas Aziz
źródło
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;
    }
 }
Steve
źródło
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

JBrooks
źródło
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".

pramod
źródło
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 = "*"

alkk
źródło
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.

Exel Gamboa
źródło