【问题标题】:When I delete an item from the database and updatethe datagrid, I still see this object当我从数据库中删除一个项目并更新数据网格时,我仍然看到这个对象
【发布时间】:2017-12-12 15:46:45
【问题描述】:

我有两个窗口 wpf。 在第一个窗口我看到来自 DataGrid 的数据,在第二个窗口我从数据库中删除对象。

第一个窗口:

private void mnRemoveProduct_Click(object sender, RoutedEventArgs e)
{
   RemoveProduct window = new RemoveProduct();
   window.ShowDialog();
   ShowWatchTable();
} // mnRemoveProduct_Click

第二个窗口:

private void btnDelete_Click(object sender, RoutedEventArgs e)
{
    if (cmbNameOfWatch.SelectedIndex > 0)
    {
        var value =
            (from watch in obj.Watch.Where(w => w.mark == cmbNameOfWatch.SelectedValue.ToString())
             select new { watch.id }).ToArray().First();

        Watch watchObj = obj.Watch.Find(value.id);
        obj.Watch.Remove(watchObj);
        obj.SaveChanges();

        this.Close();
    }
} // btnDelete_Click

和函数ShowTable

public void ShowWatchTable()
{
    obj.Watch.ToList();
    dataGrid.ItemsSource =
        from watch in obj.Watch.Local
        select new
        {
            ID = watch.id,
            Brand = watch.mark,
            Typ = watch.TypeWatch.typeName,
            Price = watch.price + " $".ToString(),
            Quantity = watch.number,
            Fabricator = watch.Fabricator.fName,
            Country = watch.Fabricator.Country.countryName
        };
}

当我从数据库中删除值时,我仍然在 DataGrid 中看到这个值。只有当我关闭并打开此表单时,我才不再看到此对象。当我添加一个元素时,使用相同的逻辑。 Datagrid 使用 ShowTable 函数进行了更新,我看到了更新的数据库。但是删除时它不起作用。请帮忙

【问题讨论】:

    标签: c# sql wpf linq


    【解决方案1】:

    据我所知,您正在使用从obj.Watch 中删除

    obj.Watch.Remove(watchObj);
    obj.SaveChanges();
    

    但是在刷新列表时,您将绑定到obj.Watch.Local,我认为这是您数据源的本地缓存。我看不到您在哪里同步它,因此您可能希望在绑定之前同步它或在本地​​同步上执行您的操作,并确保它将更改发送到远程数据源。

    【讨论】:

    • 我该怎么做?
    • 我有。谢谢!
    【解决方案2】:

    您应该确保支持数据项来源的集合实现了 INotifyCollectionChanged。

    MSDN link to docs,这里也复制了相关部分。

    绑定到数据

    要将 DataGrid 绑定到数据,请将 ItemsSource 属性设置为 IEnumerable 实现。数据网格中的每一行都绑定到数据源中的一个对象,数据网格中的每一列都绑定到数据对象的一个​​属性。为了在向源数据中添加或删除项目时自动更新 DataGrid 用户界面,DataGrid 必须绑定到实现 INotifyCollectionChanged 接口的集合,例如 ObservableCollection。要自动反映属性更改,源集合中的对象必须实现 INotifyPropertyChanged 接口。如需了解详情,请参阅数据绑定 (WPF)。

    【讨论】:

      【解决方案3】:

      您只需要手动刷新 DataGrid。 在数据源更新后添加:

      dataGrid.Items.Refresh();
      

      【讨论】:

      • 没用
      • @EmmaW。我没有从您的代码中看到您在从第二个窗口中删除项目后为第一个窗口调用 ShowWatchTable()
      【解决方案4】:

      好吧,我猜您的数据源是查询结果,但我不太确定它是否可观察(例如,当我需要绑定到集合时,我使用 IObservableCollection 来通知集合已更改)。 当您的主要视图重新获得焦点时,您可能可以尝试调用 dbGrid.Items.Refresh(); 方法

      【讨论】:

      • 没用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多