2011-12-14 2 views
0

エンティティのリストを表示するウィンドウがあり、新しいウィンドウ(グリッドではありません)でgridviewのselecteitemを編集したいと思います。フォームを送信してもエラーは発生しませんでしたが、エンティティはデータベースに変更がありません!私を助けてください。wpfの新しいウィンドウでエンティティを編集します

  private ObservableCollection<Employee> AllEmployeesData { get; set; } 
      private ListCollectionView View; 

とwindow_loadedに私がデータをフェッチするため、このメソッドを使用します:後ろの私のリストウィンドウのコードの先頭で

public void LoadAllEmployees() 
    { 
     IEnumerable<Employee> data = null; 
     using (ArchiveEntities db = new ArchiveEntities()) 
     { 
      data = db.Employees.Include("Department"); 
      this.AllEmployeesData = new ObservableCollection<Employee>(data); 
     } 
     CollectionViewSource employeeSource = (CollectionViewSource)this.FindResource("AllEmployeesDataSource"); 
     employeeSource.Source = this.AllEmployeesData; 
     this.View = (ListCollectionView)employeeSource.View; 
    } 

Editbuttonイベントをクリックします。

  EditEmployeeView win = new EditEmployeeView(); 
      View.EditItem(SelectedEmployee); 
      win.DataContext = SelectedEmployee; 

      if ((bool)win.ShowDialog()) 
      { 
       using (ArchiveEntities db = new ArchiveEntities()) 
       { 
        Employee employee = db.Employees.Single(x => x.Id == SelectedEmployee.Id); 
        db.Employees.ApplyCurrentValues(employee); 
        db.SaveChanges(); 
        View.CommitEdit(); 
       } 
      } 
      else 
      { 
       View.CancelEdit(); 
      } 

すべて上記のコードの最初のウィンドウ(エンティティのリストを表示するウィンドウ)にあります。 と私の第二のウィンドウで(最初のウィンドウの編集選択した項目のウィンドウ):

サブミットボタンのクリックイベント:

 DialogResult = true; 
     Close(); 

私の問題がある:私は編集フォームを送信するとエラーは発生していませんが、データがでセーブいけません私が編集フォームをキャンセルすると、データベースと、私はこのエラーを取得:

InvalidOperationException was unhandled: CancelEdit is not supported for the current edit item.

答えて

1

あなたはView.EditItem、View.CommitEditとView.CancelEditを使用する理由?必要なのはwin.DataContext = SelectedEmployeeだけです。エンティティに新しい編集済みデータを設定すると、私が得られないことは何ですか?

using (ArchiveEntities db = new ArchiveEntities()) 
{ 
    Employee employee = db.Employees.Single(x => x.Id == SelectedEmployee.Id); 
    db.Employees.ApplyCurrentValues(employee); 
    db.SaveChanges(); 
    View.CommitEdit(); 
} 

あなたは、DBからの従業員を取得しますが、あなたは、あなたの従業員にSelectedEmployeeから編集したデータを適用いけません。または私は何かが恋しいですか?

SelectedEmployeeは、あなたがそれを使用いけないし、戻ってそれを保存し、なぜそうdbにあなたのデシベル

data = db.Employees.Include("Department"); 
this.AllEmployeesData = new ObservableCollection<Employee>(data); 

からエンティティですか?

db.SaveChanges(SelectedEmployee); 
+0

こんにちは、私は別のウィンドウ(Seprateウィンドウ)で選択したアイテムを編集したいと思います。同じウィンドウ(グリッド内)にエンティティを保存する場合は、あなたの方法は真です。 –

+0

よく私は私のアプリでそれを使用して、私は2番目のビューのDataContextとしてSelectedItemを取る - それを変更し、SelectedItems /変更をdbに保存して保存します。 – blindmeis

+0

btwアプリケーションをデバッグする場合は、EditEmployeeViewで行ったすべての変更が反映されているはずです。 "if((bool)win.ShowDialog())"の後にブレークポイントを設定すると、SelectedItemはすべての変更を保持するはずです – blindmeis

1

datacontextの "using"は、エンティティフレームワークの本当に悪いアプローチです。

保存する前にデータコンテキストを閉じると、すべてのエンティティの結果が切断され、再設定されません。それが必要、この実装後https://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx

あなたはここに例を見ることができる接続を維持、クラスレベルのコンテキストを使用して、この方法を試してみて、

public mainClass{ 

    private ArchiveEntities db; 
    private ObservableCollection<Employee> allEmployeesData; 
    private Employee selctedEmplyee; 

    // property in binding 
    public ObservableCollection<Employee> AllEmployeesData { get{return allEmployeesData;} set{allEmployeesData=value; onPropertyChanged("AllEmployeesData"); } 
    public Employee SelctedEmplyee { get{return selctedEmplyee;} set{selctedEmplyee=value; onPropertyChanged("SelctedEmplyee"); } 

    mainWindow(){ //Constructor 

    db=new ArchiveEntities(); 
    } 

    private void onedit(){ 
    new detailWindow(SelectedEmployee).ShowDialog(); 
    //reload from db, upadte current element if modified in the detail window 
    SelectedEmployee = db.Employees.Single(x => x.Id == SelectedEmployee.Id); 
    } 

    //no need to save in main window (is only for view) 

} 

public class detailWindow(){ 

    private ArchiveEntities db; 
    private Employee selctedEmplyee; 

    //employee to modify 
    public Employee SelctedEmplyee { get{return selctedEmplyee;} set{selctedEmplyee=value; onPropertyChanged("SelctedEmplyee"); } 


    public detailWindow(Employee SelectedEmployee){ 

    db=new ArchiveEntities; // a new indipendent context 
    SelectedEmployee = db.Employees.Single(x => x.Id == SelectedEmployee.Id); 
    } 

    public void onSave(){ 
    db.SaveChanges(); //effect only in SelectedEmployee 
    // if you don'save main window data will not change 
    } 


} 
0

EmployeeクラスがIEditableObject 実装しなければならないentityframeworkのすべての電源を使用期待通りに動作します

関連する問題