Como faço para XAML DataGridColumns preencher todo o DataGrid?

117

Estou usando DataGrids em XAML (não Silverlight) com colunas redimensionáveis, o DataGrid se expandirá se o usuário redimensionar a tela.

Atualmente, se as larguras de todas as colunas do DataGrid forem menores do que a largura do DataGrid, recebo uma "coluna" extra aparecendo que não pode ser clicada e não tem nenhum propósito.

Alguém sabe fazer uma coluna sempre redimensionar para preencher todo o espaço restante?

Purplegoldfish
fonte

Respostas:

248

Se você usar Width="*"a coluna irá preencher para expandir o espaço disponível.

Se você deseja que todas as colunas dividam a grade igualmente, aplique isso a todas as colunas. Se você quiser apenas um para preencher o espaço restante, basta aplicá-lo a essa coluna com o resto sendo "Auto" ou uma largura específica.

Você também pode usar Width="0.25*"(por exemplo) se quiser que a coluna ocupe 1/4 da largura disponível.

ChrisF
fonte
2
e como fazer algo semelhante se eu estiver usando AutoGenerateColumns="True"?
javapowered em
1
@javapowered - sugiro que você faça sua própria pergunta, fazendo referência a esta.
ChrisF
16
@javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Xavier
11
@MohamedSakherSawan realmente funciona para datagrid. Tanto ColumnWidth="*"no DataGrid quanto Width="*"nas colunas individuais têm o efeito desejado
Steve
1
Dá um erro Sting não pode ser convertido para '*'
co2f2e
18

Certifique-se de que seu DataGrid tenha sido Widthdefinido como {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Assim, sua configuração de Width="*"atributo em DataGrid.Columns/DataGridXXXXColumnelementos deve funcionar.

MStack
fonte
9

Conforme observado, ColumnWidth="*"funcionou perfeitamente bem para um DataGrid em XAML.

Eu usei neste contexto:

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

Defina a Widthpropriedade das colunas com uma largura proporcional, como*

devdigital
fonte
3

My 2 Cent ->

Muito tarde para a festa

DataGrid -> Coluna -> Largura = "*" só funciona se o contêiner pai DataGrid tiver largura fixa.

exemplo: eu coloquei o DataGrid em Grid -> Coluna cuja largura = "Auto" then Width = "*" em DataGrid não funciona, mas se você definir Grid -> Column Width = "450" ​​significa fixo, funcionará bem

Muhammad Waqas Aziz
fonte
2

Outro giro no mesmo 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;
    }
 }
Steve
fonte
1

Eu adicionei um HorizontalAlignment = "Center" (o padrão é "Strech") e ele resolveu meu problema porque tornava a grade de dados apenas com a largura necessária. (Removida a configuração de largura do datagrid, se você tiver um.)

insira a descrição da imagem aqui

JBrooks
fonte
Combinado com a resposta selecionada e esta resolveu o problema para mim. Eu precisava remover a largura do próprio DataGrid. Obrigado.
Bryan Harrington
0

Isso não irá expandir a última coluna da grade xaml para ocupar o espaço restante se AutoGeneratedColumns="True".

pramod
fonte
Removi o AutoGenerateColumns, embora as colunas não sejam divididas ou esticadas em toda a largura da grade / tela de dados. Eu tenho a linha correspondente da grade como "*" e a largura das colunas não tem nenhuma largura especificada (seja "auto" ou "algum valor"). Mas ainda estou tendo problemas, aqui está o código xaml do meu design pastie.org/10085815
GK
0

defina a largura de UMA coluna para qualquer valor, ou seja, largura = "*"

Alck
fonte
0

Para quem procura uma solução alternativa em C #:

Se você precisar, por algum motivo, ter o "AutoGeneratedColumns" habilitado, uma coisa que você pode fazer é especificar a largura de todas as colunas, exceto aquelas que deseja redimensionar automaticamente (não ocupará o espaço restante , mas será redimensionado para o conteúdo da célula ).

Exemplo (dgShopppingCart é meu 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; 

Para mim, funciona como uma solução alternativa porque eu precisava redimensionar o DataGrid quando o usuário maximizasse a janela.

Exel Gamboa
fonte