前提・実現したいこと
SQLからデータを取り込み、dataGridViewに表示。入力フォームからデータを入力するとDataSetへ展開しSQLの方へ更新をかける。
というアプリケーションを勉強がてら作成しています。
イメージ:SQL⇔DataSet(DataTable)⇔dataGridView⇔入力フォーム
このアプリケーションでdataGridViewにチェックボックスを用意してあげてチェックを付けたデータに対し、削除ボタンを押下するとデータベースから該当データ(行?レコード?)を削除する機能を持たせようとしています。
SQLからデータベースをDataSetに展開し、DataSetにあるDataTableの行を削除してからDataSetでデータベースを更新かけてあげればいいと思っているのですが、DataSetの行の削除段階でエラーが発生し、苦戦しています。
解決方法をご教示願えませんでしょうか。
アプリケーション側ではGUIをこのような形で作成しています。
発生している問題・エラーメッセージ
試験的にdataGridViewの4行目(インデックスにすると3)を削除しようと実行してみましたが、下記エラーが発生しました。 エラーメッセージ:System.IndexOutOfRangeException: 'There is no row at position 3.' 該当コード:form_Main.DaSet.Tables["Test_Table1"].Rows.RemoveAt(r);
該当のソースコード
C#
1 private void button_rowRemove_Click(object sender, EventArgs e) 2 { 3 //Form_Mainのインスタンス作成 4 Form_Main form_Main = new Form_Main(); 5 6 form_Main.connection = new SqlConnection(Properties.Settings.Default.sqlServer); 7 form_Main.connection.Open(); 8 9 //行削除用コマンド 10 form_Main.DelCmd.Connection = form_Main.connection; 11 form_Main.DelCmd.CommandType = CommandType.Text; 12 form_Main.DelCmd.CommandText = "DELETE FROM Test_Table1 WHERE 選択 = @選択"; 13 14 //データセットに取得するための設定 15 form_Main.Cmd.Connection = form_Main.connection; 16 form_Main.Cmd.CommandType = CommandType.Text; 17 form_Main.Cmd.CommandText = "SELECT * FROM Test_Table1"; 18 form_Main.Sdt.SelectCommand = form_Main.Cmd; 19 20 form_Main.DaSet.Clear(); 21 form_Main.Sdt.Fill(form_Main.DaSet, "Test_Table1"); 22 23 //チェックボックスがチェックされている行を削除(複数対応) 24 for (int r = 0; r < dataGridView1.RowCount; r++) 25 { 26 if ((bool)dataGridView1.Rows[r].Cells[0].Value) 27 { 28 form_Main.DaSet.Tables["Test_Table1"].Rows.RemoveAt(r); 29 30 form_Main.DelCmd.Parameters.Clear(); 31 form_Main.DelCmd.Parameters.Add("@選択", SqlDbType.Bit, 1, "選択"); 32 form_Main.Sdt.DeleteCommand = form_Main.DelCmd; 33 34 form_Main.Apply(); 35 36 //dataGridView1.Rows.RemoveAt(r); 37 r--; 38 } 39 } 40 41 //実行結果をdataDridViewに表示 42 dataGridView1.Columns.Clear(); 43 dataGridView1.DataSource = null; 44 dataGridView1.DataSource = form_Main.DaSet.Tables["Test_Table1"]; 45 } 46
試したこと
たいしたことは試していないのですが、
form_Main.DaSet.Tables["Test_Table1"].Rows.RemoveAt(r);
をDelete()、AcceptChanges()メソッドに変更してみました。
同様のエラーが発生するため、行指定が誤っているものかと考えてますがいかがでしょうか。。
また、DataSetに取得したデータが誤っているのかと考え行・列指定でデータを出力したところ、狙ったデータが取得できていることは確認できました。
補足情報(FW/ツールのバージョンなど)
使用ツール:VisualStudio2019
ターゲットフレームワーク:.NET Core3.1
※ターゲットフレームワークについては特に拘りがありませんので、.NET Frameworkでの解決方法がござざいましたらそちらでも問題ありません。
回答2件
あなたの回答
tips
プレビュー