0

データ グリッドを使用して DbSet (Entity Framework 5) を表示するアプリケーションがあります。コードを使用して一部のエンティティを変更すると、エンドユーザーは何らかのアクション (列の並べ替えやセルの編集など) を実行してデータグリッドを更新する必要があります。

XAML:

<CollectionViewSource x:Key="componentViewSource" d:DesignSource="{d:DesignInstance {x:Type Models:Component}, CreateList=True}"/>

<TabItem Header="Components">
    <DataGrid x:Name="componentDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" 
                ItemsSource="{Binding Source={StaticResource componentViewSource}}" RowDetailsVisibilityMode="VisibleWhenSelected">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="componentTypeColumn" Binding="{Binding ComponentType}" Header="Component Type" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="descriptionColumn1" Binding="{Binding Description}" Header="Description" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="catalogNumberColumn1" Binding="{Binding CatalogNumber}" Header="Catalog Number" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="commentColumn1" Binding="{Binding Comment}" Header="Comment" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="digiKeyColumn" Binding="{Binding DigiKey}" Header="Digi Key" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="farnellColumn" Binding="{Binding Farnell}" Header="Farnell" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="inStockColumn" Binding="{Binding InStock}" Header="In Stock" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="minimumStockColumn" Binding="{Binding MinimumStock}" Header="Minimum Stock" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="manufacturerColumn" Binding="{Binding Manufacturer}" Header="Manufacturer" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="manufacturerPNColumn" Binding="{Binding ManufacturerPN}" Header="Manufacturer PN" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="mouserColumn" Binding="{Binding Mouser}" Header="Mouser" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="packageColumn" Binding="{Binding Package}" Header="Package" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="priceColumn" Binding="{Binding Price}" Header="Price" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="subTotalColumn" Binding="{Binding SubTotal}" Header="Sub Total" IsReadOnly="True" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="valueColumn" Binding="{Binding Value}" Header="Value" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</TabItem>

C#:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // That's a private field.
    componentViewSource = (CollectionViewSource)FindResource("componentViewSource");

    // That's the database context.
    db = new PotatoContext();
    db.Components.Load();
    componentViewSource.Source = db.Components.Local;
}
private void Manufacture_Product_Click(object sender, RoutedEventArgs e)
{
    var product = productDataGrid.SelectedItem as Product;
    if(product == null)
        return;
    ManufactureProduct d = new ManufactureProduct(product, db);
    d.Owner = this;
    d.ShowDialog();
    if (d.DialogResult ?? false)
    {
        foreach (var comp in product.Components)
        {
            comp.Component.InStock -= comp.Quantity * d.NumberOfUnits;
        }
        db.SaveChanges();
        var fileName = string.Format("{0}{1}{2}{3}.txt", ReportGenerator.ProductReportsFolder,
            System.IO.Path.DirectorySeparatorChar, product.Name, DateTime.Now.ToString("d.MMM.yyyy HH.mm"));
        using(var file = File.Create(fileName)) 
        {
            ReportGenerator.GenerateProductionReport(file, product, d.NumberOfUnits);
        }
    }

}

2 番目のイベント ハンドラー内の foreach ループで、コンポーネント (既に PotatoContext の一部になっている) のプロパティを変更し、コンテキストを保存します。

データ グリッドを見ると、古い値がまだ保持されているため、一部のセルで編集モードに入って特定のセルを更新するか、列ヘッダーをクリックしてすべてのセルを更新する必要があります。

知らないユーザーはそうするのを知らないかもしれないので、これは私を悩ませます。コードからコンポーネントを更新するにはどうすればよいですか? ( Grid.Items.Refresh(); を試しました)

4

0 に答える 0