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

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

ただいまの
回答率

88.91%

C# DataGridviewに配置したCheckBoxを使って、チェックを入れた項目をデータベースから一括削除したい。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 292
退会済みユーザー

退会済みユーザー

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が削除される場合がある。

エラーメッセージの表示や例外ではじかれることはない。

該当のソースコード

  protected void DeleteButton_Click(object sender, EventArgs e)
        {
            foreach (GridViewRow row in GridView1.Rows)
            {
                 CheckBox cb = row.FindControl("DeleteCheck") as CheckBox;
                    if (cb != null && cb.Checked) 
                    {
                        int productID =Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value);

                        SqlConnection con = new SqlConnection();
                        con.ConnectionString = @"接続文字列";
                        con.Open();

                            try
                            {
                                string sql = @" DELETE FROM Kaisyu_Data WHERE Data_No = " + productID + ";" + "UPDATE Kaisyu_Data SET Data_No -= 1 WHERE Data_No >= " + productID + ";";

                                SqlCommand com = new SqlCommand(sql, con);
                                com.ExecuteNonQuery();
                            }
                            catch (SqlException exc)
                            {
                            System.Diagnostics.Debug.WriteLine(exc.Message);
                            }
                            finally
                            {
                           con.Close();
                         }   
                    }
            }
            Response.Redirect("List.aspx");
        }

補足情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2020/07/14 15:59

    ただあなたの意志にそぐわなかっただけで、ノイズも増やしてなければ悪いこともしていません。
    別の人に回答してもらえば済む話なのに、自分の思い通りにならないからといって難癖をつけ、利用を妨害しているのはあなたです。あなたが満足するためのものではありません。他の解答も見させてもらいましたが、あなたは自分の考えの押し付けがすごく、相手が受け入れなければ機嫌をそこねるということを繰り返しており、今回も同じです。
    1位だかなんだか知りませんが立場を利用して全て思い通りにしようとするのではなく、気に入らないなら放っておいてください。

    キャンセル

  • SurferOnWww

    2020/07/14 16:22

    > ノイズも増やしてなければ悪いこともしていません。

    ↓ こう言われているのですけど? 「過去に投稿した質問と同じ内容の質問」をするということが Tratail にノイズを増やして悪いことをしているとは認識できませんか?

    複数のユーザーから「過去に投稿した質問と同じ内容の質問」という意見がありました
    teratailでは閲覧数を増やす目的などにより、過去に投稿した質問と同じ内容の質問を新たに投稿することは推奨していません。
    質問について新たにわかったことや試したことがあれば、すでにある質問を編集してください。

    > 気に入らないなら放っておいてください。

    前のスレッドで撤退する(=放っておく)と書いたのは認識してます? 放っておいたのに「過去に投稿した質問と同じ内容の質問」をするというのはどういうこと?

    キャンセル

  • SurferOnWww

    2020/07/14 16:26

    挙句の果てにはノイズスレッドを 2 つ残して逃げていった・・・

    キャンセル

回答 1

0

以下のコードで正常に一括削除が行われない理由と改善方法です。

理由はクエリで UPDATE ... しているところでしょう。

string sql = @" DELETE FROM Kaisyu_Data WHERE Data_No = " + productID + ";" + 
             "UPDATE Kaisyu_Data SET Data_No -= 1 WHERE Data_No >= " + productID + ";";

Data_No の連番を維持したかった?

改善方法は UPDATE ... を削除することでしょう。

主キーはレコードを一意に識別する以上のものではないと認識し、連番を維持するなどということはそもそも考えもしないのが良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • C# DataGridviewに配置したCheckBoxを使って、チェックを入れた項目をデータベースから一括削除したい。