web-dev-qa-db-fra.com

Comment faire en sorte que XAML DataGridColumns remplisse tout le DataGrid?

J'utilise DataGrids en XAML (et non Silverlight) avec des colonnes redimensionnables. DataGrid se développera si l'utilisateur redimensionne l'écran.

Actuellement, si les largeurs de toutes les colonnes de DataGrid sont inférieures à la largeur de DataGrid, une "colonne" supplémentaire apparaît, qui est non cliquable et ne sert à rien.

Est-ce que quelqu'un sait comment faire qu'une colonne soit toujours redimensionnée pour remplir tout l'espace restant?

109
Purplegoldfish

Si tu utilises Width="*" la colonne se remplira pour agrandir l’espace disponible.

Si vous voulez que toutes les colonnes divisent la grille, appliquez-la également à toutes les colonnes. Si vous voulez simplement remplir l’espace restant, appliquez-le à cette colonne, le reste étant "Auto" ou une largeur spécifique.

Vous pouvez aussi utiliser Width="0.25*" (par exemple) si vous voulez que la colonne occupe 1/4 de la largeur disponible.

230
ChrisF

Assurez-vous que votre DataGrid a Width défini sur quelque chose comme: {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Comme ça, votre réglage de Width="*" attribut sur DataGrid.Columns/DataGridXXXXColumn _ éléments devraient fonctionner.

16
MStack

Comme indiqué, le ColumnWidth="*" fonctionne parfaitement pour un DataGrid en XAML.

Je l'ai utilisé dans ce contexte:

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

Définissez la propriété columns Width de manière à avoir une largeur proportionnelle telle que *

6
devdigital

J'ai ajouté un HorizontalAlignment = "Center" (la valeur par défaut est "Strech") et cela a résolu mon problème, car la grille de données n'était plus large que nécessaire. (Suppression du paramètre Largeur de la grille de données si vous en avez un.)

enter image description here

1
JBrooks

Un autre tour sur le même thème:

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
Steve

Pour ceux qui recherchent une solution de contournement C #:

Si vous avez besoin, pour une raison quelconque, d'activer "AutoGeneratedColumns", vous pouvez notamment spécifier la largeur de toutes les colonnes, à l'exception de celles que vous souhaitez redimensionner automatiquement (cela ne prendra pas l'espace restant , mais ce sera redimensionner au contenu de la cellule).

Exemple (dgShopppingCart est mon 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; 

Pour moi, cela fonctionne comme une solution de contournement, car je devais redimensionner le DataGrid lorsque l'utilisateur agrandissait la fenêtre.

0
Exel Gamboa

définir la largeur d'une colonne sur n'importe quelle valeur, c'est-à-dire width = "*"

0
alkk

Cela ne développera pas la dernière colonne de la grille xaml pour occuper l’espace restant si AutoGeneratedColumns="True".

0
pramod

Mon 2 Cent ->

Très tard pour faire la fête

DataGrid -> Column -> Width = "*" ne fonctionne que si le conteneur parent de DataGrid a une largeur fixe.

exemple: je mets le DataGrid dans Grid -> Column dont width = "Auto" puis Width = "*" dans DataGrid ne fonctionne pas, mais si vous définissez Grid -> Column Width = "450" ​​signifie fixé puis fonctionne correctement

0
Muhammad Waqas Aziz