Comment faire en sorte que XAML DataGridColumns remplisse l'intégralité du DataGrid?

117

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

Actuellement, si les largeurs de toutes les colonnes DataGrid sont inférieures à la largeur du DataGrid, j'obtiens une "colonne" supplémentaire apparaissant qui n'est pas cliquable et ne sert à rien.

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

Purplegoldfish
la source

Réponses:

248

Si vous utilisez Width="*"la colonne se remplira pour agrandir l'espace disponible.

Si vous souhaitez que toutes les colonnes divisent la grille de manière égale, appliquez-le à toutes les colonnes. Si vous voulez juste un pour remplir l'espace restant, appliquez-le simplement à cette colonne avec le reste étant "Auto" ou une largeur spécifique.

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

ChrisF
la source
2
et comment faire une chose similaire si j'utilise AutoGenerateColumns="True"?
javapowered
1
@javapowered - Je suggère de poser votre propre question, en faisant référence à celle-ci.
ChrisF
16
@javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Xavier
11
@MohamedSakherSawan cela fonctionne en effet pour datagrid. Tant ColumnWidth="*"sur le DataGrid que Width="*"sur les colonnes individuelles ont l'effet souhaité
Steve
1
Donne une erreur Sting ne peut pas être converti en '*'
co2f2e
18

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

Comme ça, votre réglage d' Width="*"attribut sur les DataGrid.Columns/DataGridXXXXColumnéléments devrait fonctionner.

MStack
la source
9

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

Je l'ai utilisé dans ce contexte:

<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
PériphérieSilence
la source
7

Définissez la Widthpropriété des colonnes sur une largeur proportionnelle telle que*

devdigital
la source
3

Mes 2 Cent ->

Très tard pour faire la fête

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

exemple: je mets le DataGrid dans Grid -> Column dont width = "Auto" puis Width = "*" in DataGrid ne fonctionne pas mais si vous définissez Grid -> Column Width = "450" ​​signifie fixe alors cela fonctionne bien

Muhammad Waqas Aziz
la source
2

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;
    }
 }
Steve
la source
1

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

entrez la description de l'image ici

JBrooks
la source
Combiné avec la réponse choisie et celle-ci, cela a résolu le problème pour moi. J'avais besoin de supprimer la largeur sur le Datagrid lui-même. Merci.
Bryan Harrington
0

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

pramod
la source
J'ai supprimé les AutoGenerateColumns, même si les colonnes ne sont pas divisées ou étirées sur toute la largeur de la grille / écran de données. J'ai la ligne correspondante de la grille pour être "*" et la largeur des colonnes n'a aucune largeur spécifiée ("auto" ou "une valeur"). Mais j'ai toujours des problèmes, voici le code xaml de mon design pastie.org/10085815
GK
0

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

alkk
la source
0

Pour ceux qui recherchent une solution de contournement C #:

Si vous avez besoin pour une raison quelconque d'activer les "Colonnes auto-générées", une chose que vous pouvez faire est de 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 il sera redimensionné 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 j'avais besoin de redimensionner le DataGrid lorsque l'utilisateur agrandit la fenêtre.

Exel Gamboa
la source