2016-04-19 10 views
4

データベースからデータを読み取り、UIで表示するアプリケーションを作成したいと考えています。ユーザーはフィールドを追加/削除/更新してDBに保存することができます。DataBinding()がDistinct()(Entity Framework)で動作しない

私は2つのテーブルを持っています:モーターと対策。 Motorsテーブルには多くのフィールドがあり、そのうちの1つは「会社」です。もちろん、同じ会社のいくつかのモーターがあるかもしれないので、私はそれらの会社をフィルターにかけ、コンボボックス内の異なるモーターだけを取得したいと思います。

私はまだ言語とVSを使いこなしていますので、ユーザーが新しいモーターを追加できるUIのシンプルなバージョンを作成しました。実際、ユーザーは会社のフィールドを追加できます。新しい会社を追加しようとしていて、それがコンボボックスで自動的に更新されるかどうかを確認してください。この目的のために

は、私は、Entity FrameworkとデータバインディングのMSDNからこのチュートリアルを使用しています:

https://msdn.microsoft.com/en-us/data/jj682076.aspx

の問題は、私は(新会社で)新しいモーターを追加した場合、それを私は明確なものをフィルタリングする場合は更新されません、私が意味する、次のコード作業を行い、自動的にすべての企業とのコンボボックスを更新します。

 private void MainForm_Load(object sender, EventArgs e) 
    { 
     _context = new MotorsContext(); 
     _context.Motors.Load(); 

     this.companyBindingSource.DataSource = _context.companies.ToBindingList(); 
     companyBindingSource.ListChanged += CompanyBindingSource_ListChanged; 
    } 

、次ない:

private void MainForm_Load(object sender, EventArgs e) 
{ 
    _context = new MotorsContext(); 
    _context.Motors.Load(); 

    this.companyBindingSource.DataSource = _context.Motors.Local.ToBindingList().Select(x => x.company).Distinct(); 
    companyBindingSource.ListChanged += CompanyBindingSource_ListChanged; 
} 

私は、ソフトウェアは、リストには、確かに、変更されたことを検出しないときに表示するListChangedメソッドを作成しました。最初のコードではトリガしますが、2番目のコードではトリガしません。観測者はフィルタを追加したときにリストの変更を検出していない可能性がありますか?

private void CompanyBindingSource_ListChanged(object sender, ListChangedEventArgs e) 
{ 
    MessageBox.Show("List changed!"); 
} 

そして最後に、モータのボタンを追加:最初の実装では

private void button1_Click_1(object sender, EventArgs e) 
{ 
    if (!string.IsNullOrWhiteSpace(textBox1.Text)) 
    { 
     Motor m = new Motor(); 
     m.company = textBox1.Text; 
     _context.Motors.Add(m); 
     _context.SaveChanges(); 
     MessageBox.Show($"New motor, id: {m.motorID}"); 
    } 
} 

を、コンボボックスには、更新を行い、(すべてのモーター用)すべての企業を示しています

プッシュボタンを追加します - > "リストが変わった!"ポップアップ - >「新しいモーター:ID」フィルタでポップアップ

プッシュボタンを追加 - >「新しいモーター:ID」ポップアップ

は、実際にモータが追加されますが、それは表示されません。プログラムの再開まで。

何か考えていただければ幸いです。私は自分自身をよく説明してくれることを願っている

答えて

2

第二の例では次の行が壊れバインディング:

_context.Motors.Local.ToBindingList().Select(x => x.company).Distinct(); 

理由は、.Select(x => x.company).Distinct()の結果がBindingList<Motor>ではなく、シンプルなIEnumerable<string>

使用、次の代替ということです。

var _companies = _context.Motors.Select(x => x.company).Distinct().ToList(); 

this.companyBindingSource.DataSource = _companies; 
+0

あなたの答えDmitryGありがとうございます。 _context.Motors.Select(x => x.company).Distinct()。Load()を意味すると思います。しかし、それは動作していません。コンボボックスはデータで満たされていません。 _context.Motors.Where(m => m.company == "UPV")と書くと、Load();私は3つのUPVモーターを持っているので、私は3つの "UPV"とコンボボックスを取得します。会社としてUPVを使って新しいものを追加すると、リストに追加されるので、私は4になります。他の会社があれば、それも追加されるので、会社== "UPV"はもうフィルタリングされません。 Load()文のフィルタは最初のロードでのみ適用されると思いますか? – lyurealm

+0

>> Load()文のフィルタは、最初のロードでのみ適用されると思います。はい、あなたが正しい。変更後、コンテキストからデータソースをリロードする必要があります。 – DmitryG

+0

これについて詳しく説明してもらえますか? _context.Motors.Select(x => x.company).Distinct()を呼び出す必要があることを意味しますか?Load()もAddButtonからですか? – lyurealm

0

この行

this.companyBindingSource.DataSource = _context.Motors.Local.ToBindingList().Select(x => x.company).Distinct(); 

返信IEnumerable<T>。あなたの場合はそれがリストになるようにしてください。.ToList();

this.companyBindingSource.DataSource = _context.Motors.Local.ToBindingList().Select(x => x.company).Distinct().ToList(); 
+0

まず、あなたの答えをありがとう。ただし、.ToList()でも動作しないようです。 – lyurealm

関連する問題