ASP.NET Visual Studio C# .NETframework// DataGridviewにCheckBoxを配置し、チェックを入れた項目を一括削除したい。
開発環境(Windows, ASP.NET Webアプリケーション(.NET Framework4.7.2) Web Forms, Visual Studio2019, C#)
VisualStudioの.NETFrameworkでC#を用いてWebアプリケーションを作成しています。
作成するものとしては作業内容のデータ(工数など)を一覧表示するもので、機能は登録・編集・削除の三つ、画面数は1つだけです。
データベースはVisualStudioに内蔵されているSQL serverを使っています。
GridviewのテンプレートにツールボックスからCheckBoxを配置し、IDは"DeleteCheck"としてあります。
データベースのデータをGridviewで一覧表示する画面で、CheckBoxにチェックをいれ、ボタンを押すと
チェックの入っているデータがデータベースから削除され、項番を振り直して残りのデータを再表示すると
いう処理を行いたいです。
データベースの内容としては
CREATE TABLE [dbo].[Kaisyu_Data] (
[Data_No] INT NOT NULL,
[Task] NVARCHAR (50) NULL,
[Difficulty] NCHAR (10) NULL,
~~~~~
CONSTRAINT [PK_Kaisyu_Data] PRIMARY KEY CLUSTERED ([Data_No] ASC)
);
といったかたちになっています。
GridViewのIDはGridView1です。
ここでお聞きしたいのは、チェックボックスを使った一括削除に関して
以下のコードで正常に一括削除が行われない理由と改善方法です。
処理を実行した際、チェックボックスを入れたものがすべて削除されずに残ってしまいます。
エラーメッセージ等は出てきません。
以下に問題の例とソースコードを記入します。
発生している問題・エラーメッセージ
例)
a
b
c
d
e
のデータのうち、b,c,dにチェックをいれ削除ボタンを押下する。→a,eだけが残るはずだがa,c,eとなりcも残る。
データベースが増えてもだいたい真ん中あたりのデータが削除されずに残る。
a
b
c
のデータのうち、b,cにチェックをいれた場合にはb,cが削除されaのみが残り結果としては正常
a
b
c
のデータのうちbのみにチェックをいれると、aが削除される場合がある。
エラーメッセージの表示や例外ではじかれることはない。
該当のソースコード
C#
1 protected void DeleteButton_Click(object sender, EventArgs e) 2 { 3 foreach (GridViewRow row in GridView1.Rows) 4 { 5 CheckBox cb = row.FindControl("DeleteCheck") as CheckBox; 6 if (cb != null && cb.Checked) 7 { 8 int productID =Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value); 9 10 SqlConnection con = new SqlConnection(); 11 con.ConnectionString = @"接続文字列"; 12 con.Open(); 13 14 try 15 { 16 string sql = @" DELETE FROM Kaisyu_Data WHERE Data_No = " + productID + ";" + "UPDATE Kaisyu_Data SET Data_No -= 1 WHERE Data_No >= " + productID + ";"; 17 18 SqlCommand com = new SqlCommand(sql, con); 19 com.ExecuteNonQuery(); 20 } 21 catch (SqlException exc) 22 { 23 System.Diagnostics.Debug.WriteLine(exc.Message); 24 } 25 finally 26 { 27 con.Close(); 28 } 29 } 30 } 31 Response.Redirect("List.aspx"); 32 }