如何在WinForms DataGridView中刷新DataSource?

6

我从EntityFramework模型中填充GridView.DataSource:

gwTimeLog.DataSource = _entities.TimeLogs;

当向_entities添加新行时,我尝试更新网格(尝试使用与上面相同的语句,将其设置为null,然后重新设置为_entities.TimeLogs等),但是网格根本不会更新。即使_entities.TimeLogs实际上包含新行。
我错过了什么?
4个回答

13

旧回答:您尝试过调用GridView.DataBind()吗?

哎呀,我以为这是一个WebForms DataGrid。

如果您正在使用WinForms,则可以考虑查看BindingSource类。与直接绑定到列表相比,绑定到该类将提供更新通知等功能。

以下代码适用于我:

        List<Person> names = new List<Person>();
        names.Add(new Person(){
            FirstName = "Steve",
            LastName = "Jobs"
        });
        names.Add(new Person()
        {
            FirstName = "Bill",
            LastName = "Gates"
        });

        BindingSource source = new BindingSource();
        source.DataSource = names;
        dataGridView1.DataSource = source;

        names.Add(new Person()
        {
            FirstName = "Steve",
            LastName = "Balmer"
        });

        source.ResetBindings(false);

BindingSource @ MSDN: http://msdn.microsoft.com/zh-cn/library/system.windows.forms.bindingsource.aspx - hackerhasid
1
仍然无法工作。我只是想让网格更新。我不需要更新通知。也许是底层数据,即实体框架的问题。 - AngryHacker
我已经发布了上面的代码。底层数据不应该有影响。你调用了ResetBindings()吗? - hackerhasid
1
当BindingSource引用Entity Framework查询时,这将无法工作。 - Matt Dillard
是的,不幸的是,在我更新了一个表单级变量(重新从REST服务获取)之后,这个方法不起作用了。 - PeterX

7
答案是将gridview连接到BindingList而不是List。

2

这对我来说有效:

dataGridView.DataSource = null;
dataGridView.DataSource = listOfSomething;

虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。例如,将DataSource设置为null,然后再设置为其他值是否有任何原因? - ryanyuyu
这段代码会导致更新整个数据网格的内容,而仅仅将数据源设置为相同的值 - 是不必要的。 - Netstep
这是我唯一有效的方法。我曾经在其他窗体上使用ResetBindings(False),但出于某种原因,当我转向Entity Framework时它停止了工作。 - Eric Christoph

-1
 grid.EndEdit();
 BindingSource.EndEdit();
 _entities = new dbEntities();
 firmeBindingSource.DataSource=_entities.TimeLogs;

5
欢迎来到stackoverflow!为样例代码提供一个简短的描述有助于提高帖子的准确性 :) - Picrofo Software

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接