Laden...

WPF Datagrid: Spalten immer an Fenstergröße anpassen

Erstellt von Fab4guy vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.775 Views
F
Fab4guy Themenstarter:in
54 Beiträge seit 2016
vor 7 Jahren
WPF Datagrid: Spalten immer an Fenstergröße anpassen

Bei meinem Datagrid hätte ich gerne, dass sich die Spalten immer der Fenstergröße anpassen.

Das funktioniert auch, wenn ich folgende Einstellungen benutze.


<Style x:Key="mainGrid" TargetType="{x:Type DataGrid}">
<Setter Property="ColumnWidth" Value="*" />
<Setter Property="AutoGenerateColumns" Value="False" />
<Setter Property="IsReadOnly" Value="False" />
<Setter Property="CanUserAddRows" Value="True" />
<Setter Property="CanUserResizeColumns" Value="True" />
<Setter Property="GridLinesVisibility" Value="none" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="RowHeaderWidth" Value="0" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="VerticalAlignment" Value="Stretch" />
<Setter Property="MinRowHeight" Value="50" />
</Style>

Allerdings habe ich ja bei dieser Konfiguration am Schluss die leer Zeile.
Wegen CanUserAddRows = True.

Setzte ich CanUserAddRows auf False, dass die Spalte wegfällt. Ist die Zeile zwar weg aber dafür sind meine Spalten klein. Siehe Bild.

Jemand eine Idee wie ich das hinbekomme, dass meine Spalten immer maximal breit sind und die leere Zeile verschwindet?

Habe schon alle möglichen Kombinationen durch probiert auch mit IsReadOnly usw.

N
232 Beiträge seit 2011
vor 7 Jahren

Hi, zeig mal mehr von deinem Code. Bei mir wird die Spaltenbreite unabhängig von der CanUserAddRows Property entsprechend der Window Width aufgeteilt.

<Window x:Class="debug.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:debug"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="mainGrid" TargetType="{x:Type DataGrid}">
            <Setter Property="ColumnWidth" Value="*" />
            <Setter Property="AutoGenerateColumns" Value="False" />
            <Setter Property="IsReadOnly" Value="False" />
            <Setter Property="CanUserAddRows" Value="True" />
            <Setter Property="CanUserResizeColumns" Value="True" />
            <Setter Property="GridLinesVisibility" Value="none" />
            <Setter Property="BorderBrush" Value="Transparent" />
            <Setter Property="RowHeaderWidth" Value="0" />
            <Setter Property="HorizontalAlignment" Value="Stretch" />
            <Setter Property="VerticalAlignment" Value="Stretch" />
            <Setter Property="MinRowHeight" Value="50" />
        </Style>
    </Window.Resources>
    <Grid>
        <DataGrid Style="{StaticResource mainGrid}" ItemsSource="{Binding Items}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}"/>
                <DataGridTextColumn Binding="{Binding Street}"/>
                <DataGridTextColumn Binding="{Binding Postal}" />
                <DataGridTextColumn Binding="{Binding City}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

F
Fab4guy Themenstarter:in
54 Beiträge seit 2016
vor 7 Jahren

So geht es ja auch.
Setzte mal CanUserAddRows auf False.

Dann sollte es nicht mehr gehen.

N
232 Beiträge seit 2011
vor 7 Jahren

Hi, doch geht immer noch! 😃

F
Fab4guy Themenstarter:in
54 Beiträge seit 2016
vor 7 Jahren

Ich habe jetzt folgendes feststellen können.

Ich habe auch eine Gruppierung in meinem Datagrid.

Wenn ich beim Expander die Eigenschaft isExpanded="True" setze dann funktioniert ist.

Ist beim ERSTEN laden des DataGrid alles zugeklappt funktioniert es nicht.

Klappe ich aber dann eine Zeile mal auf und aktualisiere mein Grid dann über einen Button, also lade die Daten neu rein, dann passen die Header plötzlich.

F
Fab4guy Themenstarter:in
54 Beiträge seit 2016
vor 7 Jahren

Was anderes nebenbei...

Wenn ich das so wie untenstehend in meinem Grid definiere, kann ich aus dem Code raus nicht auf den Expander (dataGridExpander) zugreifen um die Eigenschaft isExpanded zu ändern.

Lösche ich <DataGrid.GroupStyle>, <GroupStyle>, <GroupStyle.ContainerStyle>, <Style TargetType="{x:Type GroupItem}">, <Setter Property="Template">, <Setter.Value>, <ControlTemplate TargetType="{x:Type GroupItem}">

habe ich Zugriff, allerdings funktioniert das Grid dann nicht mehr.
Es kommt dann immer die Meldung:

Items collection must be empty before using ItemsSource.


                <DataGrid.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.ContainerStyle>
                            <Style TargetType="{x:Type GroupItem}">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type GroupItem}">
                                            <Expander x:Name="dataGridExpander" IsExpanded="False" Style="{StaticResource dataGridGroupExpander}">
                                                <Expander.Header>
                                                    <Grid Height="40">
                                                        <Grid.ColumnDefinitions>
                                                            <ColumnDefinition Width="250"></ColumnDefinition>
                                                            <ColumnDefinition Width="270"></ColumnDefinition>
                                                            <ColumnDefinition Width="*"></ColumnDefinition>
                                                            <ColumnDefinition Width="*"></ColumnDefinition>
                                                        </Grid.ColumnDefinitions>
                                                        <StackPanel Orientation="Horizontal" Grid.Column="0">
                                                            <TextBlock Text="{Binding Items[0].Name}" VerticalAlignment="Center" />
                                                        </StackPanel>
                                                        <StackPanel Orientation="Horizontal" Grid.Column="1" >
                                                            <TextBlock Text="[" VerticalAlignment="Center" Margin="0,0,5,0"/>
                                                            <TextBlock Text="{Binding Items[0].Anzahl}" Margin="0,0,5,0" VerticalAlignment="Center"  />
                                                            <TextBlock Text="{DynamicResource gridNumberOfWorksteps}"  VerticalAlignment="Center" />
                                                            <TextBlock Text="]" VerticalAlignment="Center" Margin="5,0,0,0"/>
                                                        </StackPanel>
                                                        <Button Grid.Column="2" HorizontalAlignment="Right" Name="cmdDeleteProcess" Tag="{Binding Items[0].ID_Vorgaenge}" Style="{StaticResource buttonDelete}" ToolTip="{DynamicResource buttonDeleteProcess}" Click="cmdDeleteProcess_Click" Margin="0,0,15,0" />
                                                        <Button Grid.Column="3" HorizontalAlignment="Right" Style="{StaticResource buttonAdd}" Tag="{Binding Items[0].ID_Vorgaenge}" ToolTip="{DynamicResource buttonAddWorkStep}" Click="cmdAddWorkStep_Click" >
                                                            <TextBlock Text="{DynamicResource buttonAddWorkStep}" />
                                                        </Button>
                                                    </Grid>
                                                </Expander.Header>
                                                <ItemsPresenter />
                                            </Expander>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </GroupStyle.ContainerStyle>
                    </GroupStyle>
                </DataGrid.GroupStyle>

F
Fab4guy Themenstarter:in
54 Beiträge seit 2016
vor 7 Jahren

Ist erledigt funktioniert nun!

1.040 Beiträge seit 2007
vor 7 Jahren

Kannst du bitte für Entwickler, die das gleiche Problem haben, die Lösung posten? =)

F
Fab4guy Themenstarter:in
54 Beiträge seit 2016
vor 7 Jahren

Hatte mich getäuscht.
Das Problem besteht weiterhin!
SORRY

Kann man nicht einfach die letzte Zeile irgendwie ausblenden?

F
Fab4guy Themenstarter:in
54 Beiträge seit 2016
vor 7 Jahren

Habe das Problem jetzt so "gelöst" indem ich der Page das Event "Loaded" angehängt habe. Dort setzte ich dann canuseraddrows auf false.

Damit kann ich jetzt erstmal leben.

709 Beiträge seit 2008
vor 7 Jahren

Ich hatte gerade das Problem, dass die Spaltengrößenanpassung nicht mehr funktionierte, sobald sich das DataGrid (oder eines der Elemente, in dem es sich befindet) in einem ScrollViewer befindet.

Ich konnte das umgehen, indem ich die Width- des DataGrids an die ActualWidth-Property eines übergeordneten Objekts mit gleicher Breite gebunden habe.