绑定到EF集合的DataGridView未更新

时间:2012-12-04 16:22:30

标签: c# winforms entity-framework datagridview

关于相关主题的帖子很多,但我无法弄清楚世界上发生了什么。我有一个winform应用程序,其中包含一个显示SQL表(帐户列表)内容的数据网格。我正在使用实体框架模型进行数据管理。

预期功能如下。当主窗体启动时,它会创建一个名为“ODS”的数据模型实例。然后通过以下调用的形式的load()方法将数据链接到datagrid:

grid_accounts.DataSource = ODS.Accounts;

当在主表单上单击“添加帐户”按钮时,它会打开一个对话框,供用户填写新帐户信息。数据源将传递给对话框。如果用户单击“确定”,则会创建新的帐户实体,将其添加到ODS.Accounts,保存并关闭对话框。然后,主窗体上的数据网格应显示新帐户。

所有这些都按预期发生除了新帐户没有出现在datagrid中。我已经检查过,一旦调用了SaveChanges(),就会保存到数据库中。我还将ODS.Accounts的内容输出到控制台,新实体确实在集合中。我试过在datagrid上调用Refresh();我还尝试了将网格的dataSource设置为null的众所周知的技巧,然后将其重置为Account集合,以“欺骗”网格进行更新。没运气。我错过了一些明显的东西吗相关代码如下。感谢。

主要形式:

public partial class MainForm : Form
{
    VHN.DataAccess.ODSEntities ODS = VHN.DataAccess.Util.getODS();

    private void Load(object sender, EventArgs e)
    {
        populate();
    }

    private void button_addAccount_Click(object sender, EventArgs e)
    {
        var d = new NewAccountForm(ODS);
        if (d.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            populate();
    }

    void populate()
    {
        grid_accounts.DataSource = null;
        grid_accounts.DataSource = ODS.Accounts;

        grid_accounts.Columns[0].Visible = false;
        grid_accounts.Refresh();            
    }
}

新帐户对话框:

public partial class NewAccountForm : Form
{
    VHN.DataAccess.ODSEntities ODS;

    public NewAccountForm(ref VHN.DataAccess.ODSEntities ODS)
    {
        this.ODS = ODS;
        InitializeComponent();
    }

    private void ok_Click(object sender, EventArgs e)
    {
        int count = ODS.Accounts.Where(x => x.name == tb_name.Text).Count();

        if (count > 0)
        {
            MessageBox.Show(String.Format("Account name \"'{0}\" is already taken.", tb_name.Text));
        }
        else
        {
            VHN.DataAccess.Account account = new VHN.DataAccess.Account();
            account.id = Guid.NewGuid().ToString();
            account.name = tb_name.Text;
            ODS.Accounts.AddObject(account);
            ODS.SaveChanges();
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
            Close();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

尝试以下方法之一:(假设帐户是列表类型

grid_accounts.EndEdit();
grid_accounts.Refresh();

OR

grid_accounts.DataSource = typeof(List); 
grid_accounts.DataSource = ODS.Accounts;

更新

grid_accounts.DataSource = typeof(List<>); // OR use grid_accounts.DataSource = null;
grid_accounts.DataSource = ODS.Accounts.ToList();

答案 1 :(得分:0)

如果你还在这。

grid_accounts.DataSource = new BindingSource(ODS.Accounts);

应该可以正常工作。