2016-03-19 8 views
1

新しいWPFプロジェクトを開始し、メインウィンドウにボタンがあります。 1(tbTax命名)てtextBox 1 [追加]ボタン(のDBGridを命名) 1のDataGrid WPFエンティティフレームワークのデータグリッドリフレッシュ

は、私がデータソース]タブに移動して、データグリッドを得て、DRAG:私はそれをクリックすると、私は次のように表示される新しいウィンドウを表示します/ DROPフォーム/ウィンドウ上のテーブルから削除します。 私は、アプリケーションを実行すると、すべての計画通りに動作します。 2番目のウィンドウでは、データベーステーブルのすべてのレコードをグリッドに表示します。

NOW: 「追加ボタン」の追加コードを実行しました。ユーザがtextbox(tbTax)にテキストを入力し、[追加]ボタンをクリックしたときに、次のコードは、次のとおりです。

using (MyEntities context = new MyEntities()) 
      { 
       TAX tax = new TAX(); 
       tax.TAX1 = decimal.Parse(tbTax.Text); 
       context.TAXs.Add(tva); 
       context.SaveChanges(); 
       tbTax.Text = ""; 
       dbGrid.Items.Refresh(); 
      } 

だから、それは明らかである:私は、エンティティフレームワークを介してデータベーステーブルに項目を追加します。 しかし、コードの最後にリフレッシュ部分を追加しても、グリッドは更新されません。したがって、ウィンドウを終了して再度表示する場合にのみ、私は今追加したばかりの新しいアイテムを見ることができます。ドラッグ後

EDIT /私はこれで終わったドロップ:また

--XAML--

<DataGrid x:Name="tAXDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="10,157,10,35" RowDetailsVisibilityMode="VisibleWhenSelected"> 
      <DataGrid.Columns> 
       <DataGridTextColumn x:Name="tAXColumn1" Binding="{Binding TAX}" Header="TAX" Width="SizeToHeader"/> 
      </DataGrid.Columns> 
     </DataGrid> 

--XAML.cs--

private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      TestXXX.ArtDataSet artDataSet = ((TestXXX.ArtDataSet)(this.FindResource("artDataSet"))); 
      // Load data into the table TAX. You can modify this code as needed. 
      TestXXX.ArtDataSetTableAdapters.TAXTableAdapter artDataSetTAXTableAdapter = new TestXXX.ArtDataSetTableAdapters.TAXTableAdapter(); 
      artDataSetTAXTableAdapter.Fill(artDataSet.TAX); 
      System.Windows.Data.CollectionViewSource tAXViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("tAXViewSource"))); 
      tAXViewSource.View.MoveCurrentToFirst(); 
     } 

、私のコンテキストは別に宣言されます

namespace TestXXX 
{ 
    using System; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 

    public partial class ArtEntities : DbContext 
    { 
     public ArtEntities() 
      : base("name=ArtEntities") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

     public DbSet<BOOK> BOOKs { get; set; } 
     public DbSet<TAX> TAXs { get; set; } 
    } 
} 

とTAXクラスはこれで間違っている何

namespace TestXXX 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class TAX 
    { 
     public TAX() 
     { 
      this.BOOKs = new HashSet<BOOK>(); 
     } 

     public int ID { get; set; } 
     public Nullable<decimal> TAX1 { get; set; } 

     public virtual ICollection<BOOK> BOOKs { get; set; } 
    } 
} 

のですか?どうすれば修正できますか?

+0

https://msdn.microsoft.com/en-us/data/jj574514.aspx – StepUp

答えて

1

まず、すべてのレイヤーをUIコントロールに入れておくのは良い考えではないので、あなたは学習段階にいると思います。データ層(データベースとの通信)はモデルから分離し、モデルはビューから分離する必要があります。もちろん、他の多くのデザインがありますが、分離はすべての中核的な問題です。

WPFを使用しているときは、System.Collection.ObjectModelに含まれるObservableCollectionを知っている必要があります。このコレクションは、追加、削除などのコレクションの変更についてデータユーザー(ほとんどはwpfのUIコントロール)に通知します。

したがって、ObservableCollectionでDataGridのItemSourceを設定する必要があります。次に行う必要があるのは、このコレクションに税アイテムを追加してデータベースに保存するだけです。これ以上何もない。

+0

あなたは正しいです、私はこれで非常に新しいです。だからドラッグ&ドロップでグリッドを追加する方法はありませんか?これを行う方法として、それが利用可能で宣伝されているのはなぜですか? DataGrid withObservableCollectionのItemSourceを設定するとどういう意味ですか?私は質問にいくつかのコード行を追加しました – user1137313

+0

問題はドラッグ・アンド・ドロップではありません。コードをどのように作成するかは関係ありません。あなたはそれを書いたり、エディタでそれをドラッグして書くことができます。間違っているのは、UIコードが混在したデータを管理するコードを持っていることと、一瞬でいくつかのコアロジックが存在することです。最終的には、コードを複製し、小さな変更が副作用を引き起こす可能性があります。それは全くテスト可能ではないことに言及していない。あなたがもっと知りたいのなら、私はここにコードで別の答えを掲示します。 – Divisadero

+0

もう1つ注意してください。WPFはMVVMを宣伝します。それについて何かを読んでください。 https://msdn.microsoft.com/en-us/library/hh848246.aspx http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html – Divisadero

0

ソリューションは、新しいアイテムを追加した後、同じようAGAIN ItemSourceを設定し... ...後にすべてのウィンドウ

public partial class NewTAX : Window 
    { 
     ArtEntities db; 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      db = new ArtEntities(); 
      dbgrid.ItemsSource = db.TAXs.ToList(); 
     } 

のCSファイルで 単純なことのようです:

 using (MyEntities context = new MyEntities()) 
     { 
      TAX tax = new TAX(); 
      tax.TAX1 = decimal.Parse(tbTax.Text); 
      context.TAXs.Add(tva); 
      context.SaveChanges(); 
      tbTax.Text = ""; 
      dbgrid.ItemsSource = db.TAXs.ToList(); 
     } 
+0

これは機能していますが、必ずしも最良のソリューションではありません。以前の記事で触れたように、特別なコレクションObservableCollectionがあります。または少なくとも試してみてください。このコレクションをソースとして一度設定するだけで、コレクションに加えられたすべての変更はui control = Dataagridに入ります。あなたの方法は、グリッド内のすべてのアイテムを不必要にリセットします。 wpfでのバインディングとその動作についていくつかの情報を見つけてみてください。最も強力な機能の1つです。 – Divisadero

関連する問題