How to resize WPF DataGrid to fit its content?

前端 未结 5 1819
别那么骄傲
别那么骄傲 2020-12-28 14:47

The aim

I would like to set such size for the DataGrid (standard, from WPF) so all cells (text) would be fully visible. I have window with DockPanel, with DataGrid

相关标签:
5条回答
  • 2020-12-28 15:22

    I just came out of the same problem where I had to give options in a data grid's column to fit its width as per the content of both header and cell. I used the following code:

    private void FitToContent()
        {
            // where dg is my data grid's name...
            foreach (DataGridColumn column in dg.Columns)
            {
                //if you want to size your column as per the cell content
                column.Width = new DataGridLength(1.0, DataGridLengthUnitType.SizeToCells);
                //if you want to size your column as per the column header
                column.Width = new DataGridLength(1.0, DataGridLengthUnitType.SizeToHeader);
                //if you want to size your column as per both header and cell content
                column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Auto);
            }
        }
    

    Also I provided an option on columns to fit as per the display (datagrid's width). for that I used the same code above with the following minor change:

    column.Width = new DataGridLength(1.0, DataGridLengthUnitType.Star);

    FOR ALL COLUMNS : Make sure you keep HorizontalScrollVisibility to Auto.

    0 讨论(0)
  • 2020-12-28 15:22

    If I understood your question right and you want to:

    1. A DataGrid where columns are as wide as it's widest content.
    2. The DataGrid fits to its contents.

    This can be achieved with databinding:

    <DataGrid AutoGenerateColumns="False"
              EnableRowVirtualization="True"
              Height="111"
              HorizontalAlignment="Left"
              ItemsSource="{Binding}"
              Margin="72,203,0,0"
              Name="dataGrid"
              RowDetailsVisibilityMode="VisibleWhenSelected"
              VerticalAlignment="Top"
              Width="{Binding Path=ActualWidth, ElementName=grid}">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="Column1"
                                Binding="{Binding Path=Something1}"
                                Header="Column1" 
                                Width="Auto"  />
            <DataGridTextColumn x:Name="Column2"
                                Binding="{Binding Path=Something2}"
                                Header="Column2"
                                Width="*" />
        </DataGrid.Columns>
    </DataGrid>
    

    Here the first column is as wide is needed and the second is spreaded space which is left. However the DataGrid's width is the same as Grid's widht that is around it, so the wanted outcome is achieved.

    0 讨论(0)
  • 2020-12-28 15:33

    SizeToCells is what worked for me. I like this because its in XAML and it's concise.

    <DataGridTextColumn x:Name="nameColumn" Binding="{Binding Name}" Header="Name" Width="SizeToCells"/>
    
    0 讨论(0)
  • 2020-12-28 15:48

    In my case, I found DataGrid use HorizontalAlignment="Stretch" VerticalAlignment="Stretch" in default, So I set it to

    <DataGrid ItemsSource="{Binding Source}" Width="Auto" Height="Auto" 
              HorizontalAlignment="Center" VerticalAlignment="Center"/>
    

    Then works.

    0 讨论(0)
  • 2020-12-28 15:48

    Marko's comment is the answer:

    I'm at a bit of a loss with your resizing logic. First of all, if you set the window's SizeToContent="WidthAndHeight", then the window is shown to the full size of the datagrid. On the other hand, if you show a window at some predefined size, and you want to resize the window once the window is shown, then at that point resizing to the datagrid's desired with is very counter intuitive. Because the resizing will jump from say 100px to 400px, but what if I want to resize to only 250px... (asuming you resize by dragging the corner of the window)

    0 讨论(0)
提交回复
热议问题