Как заставить XAML DataGridColumns заполнять всю DataGrid?


117

Я использую DataGrids в XAML (не Silverlight) со столбцами с изменяемым размером, DataGrid будет расширяться, если пользователь изменяет размер экрана.

В настоящее время, если ширина всех столбцов DataGrid меньше, чем ширина DataGrid, я получаю дополнительный «столбец», который нельзя щелкнуть и не имеет смысла.

Кто-нибудь знает, как сделать так, чтобы один столбец всегда менял размер, чтобы заполнить все оставшееся пространство?

Ответы:


248

При использовании Width="*"столбец заполнится, чтобы расширить доступное пространство.

Если вы хотите, чтобы все столбцы делили сетку одинаково, примените это ко всем столбцам. Если вы просто хотите заполнить оставшееся пространство, просто примените его к этому столбцу, оставив значение «Авто» или определенной ширины.

Вы также можете использовать Width="0.25*"(например), если хотите, чтобы столбец занимал 1/4 доступной ширины.


2
а как сделать подобное, если я использую AutoGenerateColumns="True"?
javapowered

1
@javapowered - я бы предложил задать свой вопрос, ссылаясь на этот.
ChrisF

16
@javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Ксавье

11
@MohamedSakherSawan действительно работает для datagrid. И ColumnWidth="*"в DataGrid, и Width="*"в отдельных столбцах есть желаемый эффект
Стив

1
Выдает ошибку Жало не может быть преобразовано в '*'
co2f2e

18

Убедитесь, что для вашего DataGrid Widthустановлено что-то вроде {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Таким образом, ваша установка Width="*"атрибута для DataGrid.Columns/DataGridXXXXColumnэлементов должна работать.


9

Как уже отмечалось, он ColumnWidth="*"отлично работал для DataGrid в XAML.

Я использовал это в этом контексте:

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

7

Задайте для Widthсвойства columns пропорциональную ширину, например*


3

Мои 2 цента ->

Очень поздно на вечеринку

DataGrid -> Column -> Width = "*" работает, только если родительский контейнер DataGrid имеет фиксированную ширину.

пример: я помещаю DataGrid в Grid -> Column, ширина которого = "Auto", тогда Width = "*" в DataGrid не работает, но если вы установите Grid -> Column Width = "450", значит исправлено, тогда все работает нормально


2

Еще один поворот на ту же тему:

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

Я добавил HorizontalAlignment = "Center" (по умолчанию - "Strech"), и это решило мою проблему, поскольку сделало сетку данных настолько широкой, насколько это необходимо. (Удалена настройка ширины сетки данных, если она у вас есть.)

введите описание изображения здесь


В сочетании с выбранным ответом и этим он решил проблему для меня. Мне нужно было убрать ширину самого Datagrid. Спасибо.
Брайан Харрингтон

0

Это не расширит последний столбец сетки xaml, чтобы занять оставшееся пространство, если AutoGeneratedColumns="True".


Я удалил AutoGenerateColumns, хотя столбцы не разделены и не растянуты на всю ширину сетки / экрана данных. У меня есть соответствующая строка сетки «*», а ширина столбцов не имеет указанной ширины (либо «авто», либо «какое-то значение»). Но все же у меня есть проблемы, вот xaml-код моего дизайна pastie.org/10085815
GK

0

установите для ширины ОДНОГО столбца любое значение, например width = "*"


0

Для тех, кто ищет обходной путь на C #:

Если вам по какой-то причине необходимо включить «AutoGeneratedColumns», вы можете указать ширину всех столбцов, кроме тех, размер которых вы хотите автоматически изменить ( оставшееся пространство не будет занимать , но размер изменится до содержимое ячейки ).

Пример (dgShopppingCart - мой 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; 

Для меня это работает как обходной путь, потому что мне нужно было изменять размер DataGrid, когда пользователь разворачивает окно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.