質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

10110閲覧

Entity FrameworkでDataGridViewにデータバインディングしたときRowsAddedが複数回実行される

kikiinu

総合スコア21

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/12/24 03:06

編集2017/12/27 04:13

いつもお世話になっております。
EntityFrameworkを使用してDataGridViewに表示するアプリを作成しています
タイトルのとおりイベントが複数回実行されてしまいます。

開発環境は以下の通りです
VS2017
NETFramework,Version=v4.5.21
EntityFramework,version="6.2.0"

c#

1 public partial class Form2 : Form 2 { 3 private SeikouDbContext _db = new SeikouDbContext(); 4 5 public Form2() 6 { 7 InitializeComponent(); 8 } 9 10 private void Form2_Load(object sender, EventArgs e) 11 { 12 _db.SupplierStaffs.Load(); 13 dgv.DataSource = _db.SupplierStaffs.Local.ToBindingList(); 14 } 15 16 private void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 17 { 18 Debug.WriteLine($"e.RowIndex = {e.RowIndex}, e.RowCount = {e.RowCount}"); 19 } 20 } 21

「DataGridViewの設定は追加を有効にする」はチェックを外しています
それ以外のプロパティはデフォルトのままです。
イメージ説明


結果
イメージ説明
イメージ説明
1行しか追加されていないのに
Debug.WriteLine($"e.RowIndex = {e.RowIndex}, e.RowCount = {e.RowCount}");が
2回実行されています
期待しているのは、もちろん1行しか追加されていないので1回だけ実行されることです

本来は「DataGridViewの設定は追加を有効にする」はチェックをつけるのでこれで実行すると
イメージ説明
イメージ説明

Debug.WriteLine($"e.RowIndex = {e.RowIndex}, e.RowCount = {e.RowCount}");が
7回実行されています

これは仕様なのでしょうか?それともなにかプロパティを変更しないといけないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/24 06:36

DataGrid と DataGridView は違うものです。DataGrid のタグは外してください。あと、使用言語は C# のようですが、であれば C# のタグもつけることをお勧めします。
kikiinu

2017/12/27 04:13

はい。ありがとうございます。変更しました
guest

回答2

0

ベストアンサー

回答ではないですが、ためしにvs2010のVb.netで、Datatableでも行ってみましたが下記の様にkikiinuさんと
同様の結果になりました。
「DataGridViewの設定は追加を有効にする」はチェックを外した場合、2回出力
「DataGridViewの設定は追加を有効にする」はチェックをした場合、7回出力

なので、今回の現象はEntity Frameworkが原因ではなさそうです。

また、※Aと※Bを入れ替えて実行すると下記の様になりました
「DataGridViewの設定は追加を有効にする」はチェックを外した場合、1回出力
「DataGridViewの設定は追加を有効にする」はチェックをした場合、6回出力

なので、DataGridView1.DataSource = dtのタイミングで複数回RowsAddedイベントが実行されている様です。

Vb.net

1Public Class Form1 2 3 Private dt As New DataTable 4 5 Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load 6 dt.Columns.Add("aaa") 7 dt.Columns.Add("bbb") 8 9 dt.Rows.Add("111", "222") '※A 10 11 DataGridView1.DataSource = dt '※B 12 13 End Sub 14 15 Private Sub DataGridView1_RowsAdded(sender As Object, e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded 16 17 Debug.WriteLine(String.Format("e.RowIndex = {0}, e.RowCount = {1}", e.RowIndex, e.RowCount)) 18 End Sub 19 20 21 Public Sub New() 22 23 ' この呼び出しはデザイナーで必要です。 24 InitializeComponent() 25 26 ' InitializeComponent() 呼び出しの後で初期化を追加します。 27 28 End Sub 29End Class 30

投稿2017/12/27 05:20

編集2017/12/27 05:42
toro1

総合スコア90

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikiinu

2017/12/27 05:55

回答ありがとうございます。 年末の忙しい時期にわざわざ試して頂いてありがとうございます。 Entity Framework関係なかったんですね…。 別の方法で対応したいと思います。 ありがとうございました。
guest

0

質問に対する直接の回答ではなくて別の手段の提案ですが・・・

Entity Framework + Linq to Entity は DataGridView との親和性はあまり高くないです。

DataGridView を UI として、データベースのテーブルのレコードの一覧表示・編集・更新操作を行うなら、旧来の ADO.NET の DataSet / DataTable と DataAdapter を使うことをお勧めします。

一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう?

質問者さんの使っている DB でウィザードが使えるかどうか分かりませんが(SQL Server はもちろん、MySQL や Oracle でも使えるはずですが)、使えなければ、多分 VS2017 をインストールするときに一緒にインストールされた LocalDB を使って作ってみて、ウィザードが自動生成するコードを見れば今後の開発の参考になると思います。

DB が SQL Server の場合ですが、以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

操作に慣れると 10 分もかからず作れるはずです。今回のような問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

ところで、質問者さんが立てた先のスレッド https://teratail.com/questions/105000 が放置状態ですが、クローズするまできちんとフォローしていただくようお願いします。

投稿2017/12/24 06:33

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikiinu

2017/12/24 08:05

回答ありがとうございます。 最初は従来の開発でやろうとしたんですが、便利なフレームワークがあるのに気づいて それからEntity Frameworkでやることに決めました。 全然コードを書かなくて済むので感動していたのですが、やっぱりかゆいところに手が届かない…。 自社システムで期限はないのでゆっくりEntity Frameworkでやっていきたいと思います。 気になるのはどういう手順でRowsAddedイベントが呼ばれているか知りたいのですが これは調べることはかのうなんでしょうか?
退会済みユーザー

退会済みユーザー

2017/12/24 08:57

かゆいところってどこですか? 自分的には SQL クエリを書かない Entity Framework の方がその傾向が強いと思うのですが・・・ あんまりこの話を引っ張っても何だとは思うのですが、教えていただけると幸いです。
kikiinu

2017/12/27 04:36

返事ありがとうございます。 かゆいところ。というか惜しいと言うか。 DataGridViewがあるフォームを継承して違うフォームを作ろうとしたら 継承先のフォームがエラーでデザインモードが開かない。 なら、いっそDataGridViewがあるフォームは継承できないようにしてほしい。 そのためにまたネットで調べてあげくのはてに違う方法で対処して・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問