関連トピックに関する投稿が山ほどありますが、世界で何が起こっているのかわかりません。SQL テーブル (アカウントのリスト) の内容を表示するデータグリッドを含む winform アプリがあります。データ管理にエンティティ フレームワーク モデルを使用しています。
意図する機能は以下の通りです。メイン フォームが起動すると、「ODS」と呼ばれるデータ モデルのインスタンスが作成されます。データは、フォームの load() メソッドで次の呼び出しを介してデータグリッドにリンクされます。
grid_accounts.DataSource = ODS.Accounts;
メイン フォームで [アカウントの追加] ボタンをクリックすると、ユーザーが新しいアカウント情報を入力するためのダイアログが開きます。データ ソースがダイアログに渡されます。ユーザーが [OK] をクリックすると、新しいアカウント エンティティが作成され、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();
}
}
}