【问题标题】:DataGridView bound to EF collection not updating绑定到 EF 集合的 DataGridView 未更新
【发布时间】:2012-12-04 16:22:30
【问题描述】:

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

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

grid_accounts.DataSource = ODS.Accounts;

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

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

主窗体:

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();
        }
    }
}

【问题讨论】:

    标签: c# winforms entity-framework datagridview


    【解决方案1】:

    尝试以下方法之一:(假设 Accounts 是 List 类型

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

    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();
    

    【讨论】:

    • 谢谢。两种都试过了 - 都没有奏效。 Accounts 是 ObjectSet 类型。
    • 请问您是如何在 getODS() 方法中获取数据的?
    • 它只是返回数据模型的一个实例:return new ODSEntities(connectionString);
    • 尝试将 ODS 实例作为 Enumerable() 返回。
    • 查看编辑。我创建了一个虚拟项目并使用了它,它确实刷新了 datagridview。
    【解决方案2】:

    如果你还在做这个。

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

    应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多