2011-01-02 10 views
3

私はORMsでかなり新しく、Telerik OpenAccess ORMを試していますが、そのORM、とにかくまだORMを完全に解決していない。ORM、DataGridViewへのデータバインディング:データベースに保存されていない新しい行の挿入/削除

私が達成しようとしているのは、DataGridViewをバインドして、Customersテーブルのすべての顧客を示すCustomersオブジェクトのコレクションを表示することです。

私はそれをBindingSourceにバインドし、BindingSourceをDataGridViewコントロールにバインドしました。

(OpenAccess ORMのSaveChangesメソッドを使用して)既存のアイテムを正常に変更できます。保存すると、内容はデータベースに保存されます。

ただし、DataGridViewから行を削除したり、新しい行を追加したりすると、エラーメッセージも例外もなく、データベースに保存されません。

理想的には、私のような結合ルックスを行って...私は典型的なデータテーブルでこれを行うことができるだろうと同じように、ORMで可能すべてのCRUD操作を実行できるようにする

コードをしたいと思いますこの:

 List<Customer> ukCustomers = (from c in diagrams.Customer 
           where c.Country == "UK" 
           select c).ToList(); 

     customersBindingSource.DataSource = ukCustomers; 
     customersBindingSource.AllowNew = true; 

私の現在の推測では、DataGridViewのにユーザーが追加した新しい行はリストが、「自立」カスタマー・インスタンスの一部ではないということですか?私は彼らが自動的にリストに追加されると思っていたでしょう。私はリストから自動的に削除されると思っていた削除された行にも同じことが起こり、ORMのSaveChangesメソッドがそれを取り上げることができるだろうか?

バインディング以上のことをしなければなりませんか? これをやり遂げたことがある人は誰もいませんでしたが、一般に、あなたのORM(Telerikのものではない)を使って、WinFormsのデータバインディングの経験はどれくらい成功しましたか?

ありがとうございました。

答えて

3

あなたは疑いが正しいです。グリッドをオブジェクトの「フリースタンディング」リストにバインドしていますが、各オブジェクトはセルフトラッキングしていますが、リストは表示されません。このため、既存のオブジェクトへの変更は期待どおりに機能しますが、追加/削除は行われません。

解決策の1つは、標準リストの代わりに観測可能なコレクションを使用することです。次に、バインディングを同じように処理できますが、必要に応じてコンテキストから項目を追加/削除することで、イベントの追加/削除に対応します。

基本例:

private PropertyManagerModel.DemoDBEntityDiagrams context; 
    public Form1() 
    { 
     InitializeComponent(); 
     context = new DemoDBEntityDiagrams(); 
     LoadCommunities(); 
    } 

    private void LoadCommunities() 
    {   
     var communityList = new ObservableCollection<Community>(context.Communities); 
     communityList.CollectionChanged += new NotifyCollectionChangedEventHandler(communityList_CollectionChanged); 
     this.dataGridView1.DataSource = new BindingSource() { DataSource=communityList}; 
    } 

    void communityList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
      context.Add(e.NewItems); 

     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove) 
      context.Delete(e.OldItems); 

     context.SaveChanges(); 
    }  

これは、私の知る限り、すべてのORMSのためのケースとなります。お役に立てれば!

よろしく、

ジョシュア・ホルト

+0

THAのDataGridViewのコンボボックスがある場合、それは動作しません。これらの場合、ObservableCollectionは連続的にDataError Exceptionを生成します。 – sentenza

関連する問題