Come faccio a fare in modo che XAML DataGridColumns riempia l'intero DataGrid?


117

Sto usando DataGrid in XAML (non Silverlight) con colonne ridimensionabili, DataGrid si espanderà se l'utente ridimensiona lo schermo.

Attualmente, se le larghezze di tutte le colonne DataGrid sono inferiori alla larghezza del DataGrid, viene visualizzata una "colonna" aggiuntiva che non è selezionabile e non serve a nulla.

Qualcuno sa come ridimensionare sempre una colonna per riempire tutto lo spazio rimanente?

Risposte:


248

Se utilizzi Width="*"la colonna si riempirà per espandere lo spazio disponibile.

Se vuoi che tutte le colonne dividano la griglia in modo uguale, applicalo a tutte le colonne. Se vuoi che uno riempia lo spazio rimanente, applicalo a quella colonna con il resto "Auto" o una larghezza specifica.

Puoi anche usare Width="0.25*"(ad esempio) se vuoi che la colonna occupi 1/4 della larghezza disponibile.


2
e come fare una cosa simile se sto usando AutoGenerateColumns="True"?
javapowered

1
@javapowered - Suggerirei di porre la tua domanda, facendo riferimento a questa.
ChrisF

16
@javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Xavier,

11
@ MohamedSakherSawan funziona davvero per datagrid. Sia ColumnWidth="*"sulla DataGrid che Width="*"sulle singole colonne hanno l'effetto desiderato
Steve

1
Fornisce un errore Sting non può essere convertito in '*'
co2f2e

18

Assicurati che il tuo DataGrid sia Widthimpostato su qualcosa di simile {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

In questo modo, la tua impostazione di Width="*"attributo sugli DataGrid.Columns/DataGridXXXXColumnelementi dovrebbe funzionare.


9

Come notato, ha ColumnWidth="*"funzionato perfettamente per un DataGrid in XAML.

L'ho usato in questo contesto:

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

7

Impostare la Widthproprietà delle colonne su una larghezza proporzionale come*


3

I miei 2 cent ->

Molto tardi alla festa

DataGrid -> Colonna -> Larghezza = "*" funziona solo se il contenitore padre DataGrid ha una larghezza fissa.

esempio: ho inserito DataGrid in Grid -> Colonna la cui larghezza = "Auto" quindi Larghezza = "*" in DataGrid non funziona ma se imposti Grid -> Larghezza colonna = "450" ​​significa fisso, allora funziona bene


2

Un altro giro sullo stesso tema:

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

Ho aggiunto un HorizontalAlignment = "Center" (il valore predefinito è "Strech") e ha risolto il mio problema perché ha reso il datagrid largo solo quanto necessario. (Rimossa l'impostazione Larghezza del datagrid se ne hai una.)

inserisci qui la descrizione dell'immagine


Combinato con la risposta selezionata e questa ha risolto il problema per me. Avevo bisogno di rimuovere la larghezza sul Datagrid stesso. Grazie.
Bryan Harrington

0

Questo non espanderà l'ultima colonna della griglia xaml per occupare lo spazio rimanente se AutoGeneratedColumns="True".


Ho rimosso AutoGenerateColumns, anche se le colonne non sono divise o allungate per l'intera larghezza della griglia / schermo dei dati. La riga corrispondente della griglia deve essere "*" e la larghezza delle colonne non ha alcuna larghezza specificata ("auto" o "un valore"). Ma continuo ad avere problemi, ecco il codice xaml
GK

0

imposta la larghezza di UNA colonna su qualsiasi valore, ad esempio larghezza = "*"


0

Per chi cerca una soluzione alternativa in C #:

Se per qualche motivo hai bisogno di abilitare "AutoGeneratedColumns", una cosa che puoi fare è specificare la larghezza di tutte le colonne tranne quelle che desideri vengano ridimensionate automaticamente (non occuperà lo spazio rimanente , ma ridimensionerà al contenuto della cella ).

Esempio (dgShopppingCart è il mio 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; 

Per me funziona come una soluzione alternativa perché avevo bisogno di ridimensionare DataGrid quando l'utente massimizza la finestra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.