2017-06-22 18 views
1

は、私はデータベースへのSQL-接続によるWPFアプリケーションを作成します。私のテストアプリケーションでは、NorthWindデータベースを使用しています。私はこのTutorialをMSDNで使い、DataContextクラスと私のアプリケーションのエンティティクラスを作成しました。また、エンティティ "Customers"のオブジェクトデータソースも作成しました。ドラッグ&ドロップ&を使用してMainWindow.xamlにデータソースを追加した後、自動的にデータグリッドを作成しました。WPF DataContextのSQL更新、削除、挿入

MainWindow.xaml:

<Window x:Class="WpfApplicationDataGridTest.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:WpfApplicationDataGridTest" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="500" Width="525" Loaded="Window_Loaded"> 
<Window.Resources> 
    <CollectionViewSource x:Key="customerViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Customer}, CreateList=True}"/> 
    <CollectionViewSource x:Key="customerOrderViewSource" Source="{Binding Order, Source={StaticResource customerViewSource}}"/> 
</Window.Resources> 
<Grid DataContext="{StaticResource customerOrderViewSource}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="5"/> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="40"/> 
    </Grid.RowDefinitions> 
    <GridSplitter Grid.Row="1" Background="DarkGray" Height="5" HorizontalAlignment="Stretch"/> 
    <DataGrid x:Name="customerDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource customerViewSource}}" RowDetailsVisibilityMode="VisibleWhenSelected"> 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="addressColumn" Binding="{Binding Address}" Header="Address" Width="SizeToHeader"/> 
      <DataGridCheckBoxColumn x:Name="boolColumn" Binding="{Binding Bool}" Header="Bool" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="cityColumn" Binding="{Binding City}" Header="City" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="companyNameColumn" Binding="{Binding CompanyName}" Header="Company Name" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="contactNameColumn" Binding="{Binding ContactName}" Header="Contact Name" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="contactTitleColumn" Binding="{Binding ContactTitle}" Header="Contact Title" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="countryColumn" Binding="{Binding Country}" Header="Country" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="customerIDColumn" Binding="{Binding CustomerID}" Header="Customer ID" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="faxColumn" Binding="{Binding Fax}" Header="Fax" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="phoneColumn" Binding="{Binding Phone}" Header="Phone" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="postalCodeColumn" Binding="{Binding PostalCode}" Header="Postal Code" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="regionColumn" Binding="{Binding Region}" Header="Region" Width="SizeToHeader"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    <DataGrid x:Name="orderDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Grid.Row="2" RowDetailsVisibilityMode="VisibleWhenSelected"> 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="orderIDColumn" Binding="{Binding OrderID}" Header="Order ID" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="customerIDColumn1" Binding="{Binding CustomerID}" Header="Customer ID" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="employeeIDColumn" Binding="{Binding EmployeeID}" Header="Employee ID" Width="SizeToHeader"/> 
      <DataGridTemplateColumn x:Name="orderDateColumn" Header="Order Date" Width="SizeToHeader"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DatePicker SelectedDate="{Binding OrderDate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn x:Name="requiredDateColumn" Header="Required Date" Width="SizeToHeader"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DatePicker SelectedDate="{Binding RequiredDate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn x:Name="shippedDateColumn" Header="Shipped Date" Width="SizeToHeader"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DatePicker SelectedDate="{Binding ShippedDate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTextColumn x:Name="shipViaColumn" Binding="{Binding ShipVia}" Header="Ship Via" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="freightColumn" Binding="{Binding Freight}" Header="Freight" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="shipNameColumn" Binding="{Binding ShipName}" Header="Ship Name" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="shipAddressColumn" Binding="{Binding ShipAddress}" Header="Ship Address" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="shipCityColumn" Binding="{Binding ShipCity}" Header="Ship City" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="shipRegionColumn" Binding="{Binding ShipRegion}" Header="Ship Region" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="shipPostalCodeColumn" Binding="{Binding ShipPostalCode}" Header="Ship Postal Code" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="shipCountryColumn" Binding="{Binding ShipCountry}" Header="Ship Country" Width="SizeToHeader"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Button x:Name="buttonSave" Content="Save" HorizontalAlignment="Right" Margin="0,0,10,8" Grid.Row="3" VerticalAlignment="Bottom" Width="75" Click="buttonSave_Click"/> 
    <Button x:Name="buttonTest" Content="Test" HorizontalAlignment="Right" Margin="0,0,90,8" Grid.Row="3" VerticalAlignment="Bottom" Width="75" Click="buttonTest_Click"/> 
</Grid> 

MainWindow.xaml.cs:

public partial class MainWindow : Window 
{ 
    private NorthWindDataContext northWindDataContext = new NorthWindDataContext(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     CollectionViewSource customerViewSource = ((CollectionViewSource)(this.FindResource("customerViewSource"))); 
     customerViewSource.Source = northWindDataContext.Customers; 
    } 

    private void buttonSave_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      northWindDataContext.SubmitChanges(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

データが細かい表示されますが、私はレコードを更新、削除または挿入しようとした場合変更がデータベースにコミットされていないと私はデバッグ中の値をチェックした場合の値は、更新、削除または挿入されたが、私は、アプリケーションを再起動した場合、変更が保存されてやりなさいされています。 行動は、Northwindデータベースでも、私がテストしている他のすべてのデータベースでだけではありません。

+0

私はあなたが右のそれを提出bevoreデバッガ内のデータを持っている場合、これは 'XAML'の問題であるかを確認いけません。たぶん、 'SubmitChanges()'にもっと焦点を当てるでしょう。 – Peter

+0

@Peterあなたが正しいと思います。私は同じものをWindowsFormsアプリケーションでテストしましたが、同じ問題があります。 – daniel59

+0

データベースはどこにありますか?ローカルデータベースを使用している場合は、アプリケーションの*出力*フォルダにデータベースファイル(bin/Debugまたはbin/Release)があるかどうかを確認します。あなたはおそらく各ビルドでこれを上書きしています。 – mm8

答えて

1

ローカルデータベースを使用している場合は、アプリケーションの出力フォルダ内のデータベースファイル(bin/Debugまたはbin/Release)が各ビルドで上書きされないようにする必要があります。

言い換えれば、あなたは各実行で同じデータベースファイルへの書き込みをされていることを確認する必要があります。

関連する問題