WPF实体框架datagrid刷新

时间:2016-03-19 10:10:15

标签: c# wpf entity-framework datagrid

我开始了一个新的WPF项目,在主窗口我有一个按钮。当我单击它时,我会显示一个新窗口,显示如下: 1个textBox(名为tbTax) 1添加按钮 1 DataGrid(名为dbGrid)

我通过转到DataSources选项卡获取了DataGrid,并从表单/窗口中的表中获取了DRAG / DROP。 当我运行应用程序时,它都按计划运行。在第二个窗口中,我在网格中看到了数据库表中的所有记录。

现在: 我为“添加按钮”添加了代码。因此,当用户在textBox(tbTax)中输入一些文本并单击Add按钮时,会出现以下代码:

 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();
            }

所以应该很明显:我通过实体框架将一个项添加到数据库表中。 但即使我在代码末尾添加了刷新部分......网格也不会刷新。因此,只有当我退出窗口并重新显示它时,才会看到我刚刚添加的新项目。

修改 在拖放之后我最终得到了这个:

- 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; }
    }
}

这有什么问题?我该如何解决?

2 个答案:

答案 0 :(得分:1)

首先,我假设您只处于学习阶段,因为将所有图层放入UI控件并不是一个好主意。数据层(与数据库通信)应与模型分离,模型应与视图分开。当然还有许多其他设计,但分离是所有这些设计的核心问题。

在使用WPF时,您应该知道System.Collection.ObjectModel中包含的ObservableCollection。此集合通知数据用户(主要是wpf中的UI控件)有关集合中的更改,如添加,删除等。

所以你需要做的是使用ObservableCollection设置DataGrid的ItemSource。您接下来要做的只是将税项添加到此集合中并将其保存到数据库中。没什么。

答案 1 :(得分:0)

解决方案似乎很简单...... 在Window的CS文件中

 public partial class NewTAX : Window
    {
        ArtEntities db;

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

...然后在添加新项目后,只需将ItemSource设置为:

        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();
        }