4

Entity Frameworkを使用した単純なプロジェクトがあり、にがあり、DataGridViewそのプロパティをFormに設定していますが、それでも新しい行を追加することはできません。AllowUserToAddRowtrue

そしてここに私のコードがあります:

DBEntities context = new DBEntities();
private void Form1_Load(object sender, EventArgs e)
{
    var q = (from i in context.myTable
             select i).ToList();
    DataGridView.DataSource = q;
}

private void btnSave_Click(object sender, EventArgs e)
{
    context.SaveChanges();
    MessageBox.Show("saved successfully");
}

BindingSourceコントロールを使用すると、行を挿入できますDataGridViewが、このアプローチcontext.SaveChanges()では、データベースファイルにinsertを何も呼び出さなかった後です。DataGridViewしたがって、この問題に関連しているのではないかと思いました。true AllowUserToAddRowプロパティを使用すると、に行を挿入できませんDataGridView

4

4 に答える 4

2

私は 4 から EF 6 に痛々しくアップグレードしましたが、同様の問題があります。EF6 での解決策は以下のとおりです。

DBEntities context = new DBEntities();
private void Form1_Load(object sender, EventArgs e)
{
  context.MyTable.Where(e => e.myField == 1).Load();

  BindingSource bs = new BindingSource();
  bs.DataSource = context.MyTable.Local.ToBindingList();
  myDatagridView.DataSource = bs;
}

context.SaveChanges(); を使用できるようになりました。変更または挿入を保存するには

于 2014-01-31T16:26:43.090 に答える
2

問題は.ToList()、クエリを呼び出して具体化することです。これにより、完全なデータバインディングが壊れているようです。

あなたは単純に持つことができるはずです:

DBEntities context = new DBEntities();
private void Form1_Load(object sender, EventArgs e)
{
    var q = (from i in context.myTable
             select i);
    DataGridView.DataSource = q;
}

私はこれを試してみましたが、新しい行を許可するのに問題なく動作します(テーブルに主キーが必要ですが、とにかくそれが必要です)。


注意:この動作は Entity Framework 4.1 で意図的に壊れています - Webforms data binding with EF Code-First Linq query error


私は実際に少し驚いたので、私の答えですべきだと言います。これは簡単です。以前のバージョンの Entity Framework ではうまく機能しなかったことを思い出し、4.0 はあまり使用していません。

上記の解決策がうまくいかない場合は、これを難しい方法で行い、保存する前に自分で新しいオブジェクトを追加する必要がある場合があります。

最初にバインディング ソースを導入し、保存するときに次のようなことを行います (例では Customer という架空のエンティティを使用)。

foreach (Customer customer in bs.List)
{         
    // In my db customerId was an identity column set as primary key
    if (customer.CustomerId == 0)
        context.Customers.AddObject(customer);
}
context.SaveChanges();
于 2012-08-03T19:32:43.417 に答える
0

dataGridView をソースにバインドする場合、行を挿入する唯一の適切な方法は、DataGridView がバインドされているデータ構造に行を追加することです。

于 2012-08-03T17:50:23.923 に答える