关于相关主题的帖子很多,但我无法弄清楚世界上发生了什么。我有一个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();
}
}
}
答案 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);
应该可以正常工作。