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