web-dev-qa-db-ja.com

WPF DataGrid-列を追加する理由

DataGridを使用してデータを表示するWPFアプリがあります。プログラムを実行すると、次のような追加の列があります。 enter image description here

VS2010で設計すると、次のようになります。enter image description here

データグリッドでAutoGenerateColumnsをオフにし、列を個別に指定しました(これはユーザーコントロールです)。

<Grid Margin="10,10,10,10">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition />
    </Grid.RowDefinitions>


    <DataGrid x:Name="EmployeeHours" AutoGenerateColumns="False" ItemsSource="{Binding EmployeeHoursLastWeek}" Width="Auto">
        <DataGrid.Columns>
            <DataGridTextColumn Header="PerceptionistID" Binding="{Binding PerceptionistID}" Width="100" />
            <DataGridTextColumn Header="Week Of" Binding="{Binding WeekOf, StringFormat={}{0:MM/dd/yyyy}}" Width="75" />
            <DataGridTextColumn Header="Regular Hours" Binding="{Binding WorkHours}" Width="100" />
            <DataGridTextColumn Header="PTO Hours" Binding="{Binding PTOHours}" Width="100" />
            <DataGridTextColumn Header="Holiday Hours" Binding="{Binding HolidayHours}" Width="100" />
        </DataGrid.Columns>
    </DataGrid>

    <Button x:Name="ImportHoursButton" Content="Import Hours" 
            Command="{Binding ImportHoursCommand}" 
            Height="25" Width="100" Margin="10"
            VerticalAlignment="Bottom" HorizontalAlignment="Right"                
            Grid.Row="1" />
</Grid>

また、インジェクションを使用してビューを表示するMainWindowViewもあります(これは通常のウィンドウです)。

<Window x:Class="Sidekick.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:Sidekick.ViewModel"
        xmlns:vw="clr-namespace:Sidekick.View"
        Title="Sidekick">

    <!-- Typically done in a resources dictionary -->    
    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:EmployeeHoursViewModel}">
            <vw:EmployeeHoursView />
        </DataTemplate>
    </Window.Resources>

    <StackPanel>
        <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" />
    </StackPanel>

</Window>

デザイナーでは、ウィンドウをグリッドとボタンに対応できるだけの大きさにしたいので、MainWindowViewとEmployeeHoursViewの両方を自動サイズルートとして指定しました。ただし、プログラムを実行すると、データグリッドに追加の列が表示され、プログラムウィンドウがEmployeeHoursViewに必要なサイズの約2倍(幅と高さの両方)になります。アプリケーションウィンドウが特定の値を提供せずにEmployeeHoursViewに十分な大きさになるように、これをどのようにコーディングできますか?この追加の列が表示される原因は何ですか?

27
BrianKE

「追加の列」は実際には未使用のスペースです。各列はWidth値を定義するため、一度割り当てられると、余白が残ります。

そのスペースを削除したい場合は、少なくとも1つの列を*列を使用できるように拡大します。

Visual Studioで正常に見える理由についての私の推測は、おそらくデザイナーの幅がランタイムの幅よりも小さい値に設定されているためです。それが大きければ、同じことがわかります。

コントロールを伸ばしたくない場合は、コントロールの(または親の)水平/垂直の配置をストレッチ以外に設定してください。

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" />
</StackPanel>
41
Rachel

まあ、その未使用のスペースなので、別の方法として、固定幅ではなく加重幅を使用します。ハイブリッドアプローチを使用することもできます。その場合、一部は固定され、一部は重み付けされます。その場合は、重み付けされていることを確認してください(*)したがって、コードでは次のようになります。

<DataGridTextColumn Header="PerceptionistID" Binding="{Binding PerceptionistID}" Width="4*" />
        <DataGridTextColumn Header="Week Of" Binding="{Binding WeekOf, StringFormat={}{0:MM/dd/yyyy}}" Width="3*" />
        <DataGridTextColumn Header="Regular Hours" Binding="{Binding WorkHours}" Width="4*" />
        <DataGridTextColumn Header="PTO Hours" Binding="{Binding PTOHours}" Width="4*" />
        <DataGridTextColumn Header="Holiday Hours" Binding="{Binding HolidayHours}" Width="4*" />
1

表示されている左側の領域は行ヘッダーです。 HeadersVisibilityを「Column」または「None」のいずれかに設定します(必要に応じて)

0
Jym

XAMLにColumnWidth = "*"を入れれば、確実に機能します。

<DataGrid x:Name="DG_FileShow" ColumnWidth="*" ItemsSource="{Binding}" 
 HorizontalAlignment="Left" VerticalAlignment="Top" Height="345" Width="654" 
 Margin="34,53,0,0" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Names" Binding="{Binding}" />
        </DataGrid.Columns>
 </DataGrid>
0
Adeel Kamran