0

関連トピックに関する投稿が山ほどありますが、世界で何が起こっているのかわかりません。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();
        }
    }
}
4

2 に答える 2

0

次のいずれかを試してください: (アカウントがリスト型であると仮定して

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 に答える