【问题标题】:WPF Entity framework datagrid refreshWPF 实体框架数据网格刷新
【发布时间】:2016-07-06 03:39:21
【问题描述】:

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

我通过转到 DataSources 选项卡获得了 DataGrid,然后从那里 DRAG/DROP 在窗体/窗口上的一个表。 当我运行该应用程序时,一切都按计划进行。在第二个窗口中,我在网格中看到数据库表中的所有记录。

现在: 我为“添加按钮”做了添加代码。所以当用户在文本框(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();
            }

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

编辑 在拖放之后,我最终得到了这个:

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

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

【问题讨论】:

标签: c# wpf entity-framework datagrid


【解决方案1】:

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

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

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

【讨论】:

  • 你说得对,我对此很陌生。所以添加带有拖放功能的网格不是要走的路?!?!为什么它是可用的并被宣传为一种这样做的方法?用ObservableCollection设置DataGrid的ItemSource是什么意思?我在问题中添加了几行代码
  • 问题不在于拖放它。您将如何创建代码并不重要。您可以编写它或让编辑器通过拖动它来编写它。问题是您拥有管理与 UI 代码混合的数据的代码,并且稍后还会有一些核心逻辑。最后,您将处于复制代码的情况,而小的更改可能会产生副作用。更不用说它根本不可测试。如果您想了解更多信息,请告诉我,我将在此处发布另一个带有代码的答案。
  • 另一个注意事项:WPF 提升了 MVVM。读一些关于它的东西。 msdn.microsoft.com/en-us/library/hh848246.aspxcsharperimage.jeremylikness.com/2010/04/…
【解决方案2】:

毕竟解决方案似乎很简单...... 在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 AGAIN 设置为:

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

【讨论】:

  • 它正在工作,但不一定是最佳解决方案。正如我在上一篇文章中提到的,您应该使用一个特殊的集合“ObservableCollection”。或者至少尝试一下。您只需将此集合设置为 Source 一次,对集合所做的所有更改都将进入 ui control = datagrid。您的方式会不必要地重置网格中的所有项目。尝试查找有关 wpf 中的绑定及其工作原理的一些信息。这是其最强大的功能之一。
猜你喜欢
  • 2017-11-12
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多