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?

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.


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.


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}" />

7

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


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


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;
    }
 }

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


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".


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 = "*"


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.