0

我有一个绑定到BindingSource绑定到DataContext表的网格,如下所示:

myBindingSource.DataSource = myDataContext.MyTable;
myGrid.DataSource = myBindingSource;

BindingSource插入后无法刷新。这没有用:

myDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myBindingSource);
myBindingSource.ResetBinding(false);

这都不是:

myDataContext.Refresh(RefreshMode.OverwriteCurrentValues, myDataContext.MyTable);
myBindingSource.ResetBinding(false);

我该怎么办?

4

7 回答 7

2

我已经解决了这个问题,但不是以我想要的方式。

事实证明,DataContext 和 Linq To SQL 最适合工作单元操作。意味着您创建一个 DataContext,完成您的工作,然后丢弃它。如果您需要其他操作,请创建另一个操作。

对于这个问题,我唯一要做的就是像 this.dx = new MyDataContext(); 一样重新创建我的 DataContext。如果你不这样做,你总是会得到陈旧/缓存的数据。从我从各种博客/论坛帖子中读到的内容来看,DataContext 是轻量级的,并且可以做到这一点。这是我搜索一天后找到的唯一方法。

于 2009-10-23T08:58:01.013 回答
1

最后还有一个可行的解决方案。

此解决方案工作正常,不需要重新创建 DataContext。

  1. 您需要重置内部表缓存。 为此,您需要使用反射更改 Table 的私有属性 cachedList。

您可以使用以下实用程序代码:

    public static class LinqDataTableExtension
    {
        public static void ResetTableCache(this ITable table)
        {
            table.InternalSetNonPublicFieldValue("cachedList", null);
        }

        public static void ResetTableCache(this IListSource source)
        {
            source.InternalSetNonPublicFieldValue("cachedList", null);
        }

        public static void InternalSetNonPublicFieldValue(this object entity, string propertyName, object value)
        {
            if (entity == null)
                throw new ArgumentNullException("entity");
            if(string.IsNullOrEmpty(propertyName))
                throw new ArgumentNullException("propertyName");

            var type = entity.GetType();
            var prop = type.GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);
            if (prop != null)
                prop.SetValue(entity, value);
// add any exception code here if property was not found :)
        }
    }

使用类似的东西:

   var dSource = Db.GetTable(...)
   dSource.ResetTableCache();
  1. 您需要使用以下方法重置 BindingSource:

    _BindingSource.DataSource = new List(); _BindingSource.DataSource = dSource; // hack - 刷新绑定列表

  2. 享受 :)

于 2010-04-08T17:29:19.247 回答
1

我也有同样的问题。我使用表单在我的表中创建行,而不是每次都保存上下文。幸运的是,我有多种形式这样做,一种正确更新了网格,另一种没有。

唯一的区别?
我将一个绑定到实体(不使用 bindingSource)与您所做的类似:

myGrid.DataSource = myDataContext.MyTable;

我绑定的第二个:

myGrid.DataSource = myDataContext.MyTable.ToList();

第二种方法奏效了。

于 2011-02-17T16:56:59.290 回答
1

通过新查询而不是 Contest.Table 来引用网格数据源。简单的解决方案<但工作。

哪里是例如。!!!!!!谢谢 - 几天后问题解决了!!!但是用这么简单的方法..

CrmDemoContext.CrmDemoDataContext Context = new CrmDemoContext.CrmDemoDataContext();

var query = from it in Context.Companies select it;
// initial connection
dataGridView1.DataSource = query;

更改或添加数据后

Context.SubmitChanges();
//call here again 
dataGridView1.DataSource = query;
于 2011-09-23T14:19:11.573 回答
0

我认为您还应该刷新/更新数据网格。您需要强制重绘网格。

于 2009-10-20T13:05:58.663 回答
0

不确定如何插入行。我在使用时遇到了同样的问题DataContext.InsertOnSubmit(row),但是当我只是将行插入到 BindingSourceBindingSource.Insert(Bindingsource.Count, row) 中并仅将 DataContext 用于DataContext.SubmitChanges()and时DataContext.GetChangeSet()。BindingSource 将行插入到网格和上下文中。

于 2011-11-03T01:20:24.623 回答
0

Atomosk的回答帮助我解决了类似的问题 - 非常感谢Atomosk

我通过以下两行代码更新了我的数据库,但 DataGridView 没有显示更改(它没有添加新行):

this.dataContext.MyTable.InsertOnSubmit(newDataset);
this.dataContext.SubmitChanges();

this.dataContext.MyTable设置BindingSource对象的DataSource属性,该对象设置为DataGridView对象的DataSource属性。在代码中它看起来像这样:

DataGridView dgv = new DataGridView();
BindingSource bs = new BindingSource();
bs.DataSource = this.dataContext.MyTable; // Table<T> object type
dgv.DataSource = bs;

设置bs.DataSource等于null之后返回this.dataContext.MyTable也无助于更新 DataGridView。

正如Atomosk 所提到的,使用新条目更新 DataGridView 的唯一方法是完全不同的方法,将其添加到 BindingSource 而不是 DataContext 的相应表。

this.bs.Add(newDataset);
this.dataContext.SubmitChanges();

不这样做会bs.Count;返回一个较小的数字,因为this.dataContext.MyTable.Count(); 这没有意义,在我看来似乎是绑定模型中的一个错误。

于 2013-04-18T16:28:08.320 回答