插入后刷新BindingSource(Linq To SQL)

时间:2009-10-20 12:46:37

标签: winforms linq-to-sql bindingsource

我有一个绑定到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);

这两个都没有:

{{1}}

我该怎么办?

7 个答案:

答案 0 :(得分:2)

我已经解决了问题,但没有按照我想要的方式解决。

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

对于这个问题,我唯一需要做的就是重新创建我的DataContext,如this.dx = new MyDataContext();.如果不这样做,您将始终获得陈旧/缓存的数据。从我从各种博客/论坛帖子中读到的内容,DataContext是轻量级的,并且做了这个A-OK。这是我在寻找一天后找到的唯一方式。

答案 1 :(得分:1)

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

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

  1. 您需要重置内部表缓存。 为此,您需要使用反射更改表的私有属性cachedList。
  2. 您可以使用以下实用程序代码:

        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. 享受:)

答案 2 :(得分:1)

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

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

myGrid.DataSource = myDataContext.MyTable;

我受约束的第二个:

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

第二种方式有效。

答案 3 :(得分:1)

Grid Data Source Referesh by new query而不仅仅是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;

答案 4 :(得分:0)

我认为你还应该刷新/更新datagrid。你需要强制重绘网格。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

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

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。< / p>

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

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

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