0

有大量关于相关主题的帖子,但我无法弄清楚世界上发生了什么。我有一个包含显示 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();
        }
    }
}
4

2 回答 2

0

尝试其中一种:(假设 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();
于 2012-12-04T17:04:34.913 回答
0

如果你还在这个。

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

应该可以正常工作。

于 2017-11-23T10:16:51.913 回答