我有一个绑定到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}}
我该怎么办?
答案 0 :(得分:2)
我已经解决了问题,但没有按照我想要的方式解决。
事实证明,DataContext和Linq To SQL最适合工作单元操作。意味着您创建一个DataContext,完成工作,丢弃它。如果您需要其他操作,请创建另一个操作。
对于这个问题,我唯一需要做的就是重新创建我的DataContext,如this.dx = new MyDataContext();.如果不这样做,您将始终获得陈旧/缓存的数据。从我从各种博客/论坛帖子中读到的内容,DataContext是轻量级的,并且做了这个A-OK。这是我在寻找一天后找到的唯一方式。
答案 1 :(得分:1)
最后还有一个有效的解决方案。
此解决方案工作正常,不需要重新创建DataContext。
您可以使用以下实用程序代码:
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();
您需要使用以下内容重置BindingSource :
_BindingSource.DataSource = new List(); _BindingSource.DataSource = dSource; // hack - 刷新绑定列表
享受:)
答案 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();
在我看来,这没有意义,似乎是绑定模型中的一个错误。