前提・実現したいこと
GridViewを使用してWebアプリケーションを作成しています。
GridViewにはMySQLを使用しテーブルを表示しておりますが、データテーブルには情報が入っていないようで(GridViewには表示されているので、表示後破棄されている?)、削除ボタンが機能しません。
行の「選択」ボタンを押し、削除ボタンを押すと行が削除されるようにしたいのですが、「選択」ボタンを押したときエラーが出てしまいました。(削除ボタンはスマートタグを使用せずコーディングする予定なので、下のコードになっています。)
(System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'dt が null でした。)
該当のソースコード
●Window1(~.aspx) <%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="MySql.Data.MySqlClient" %> <%@ Import Namespace="System.Configuration" %> <script runat="server"> protected void Page_Load(Object source, EventArgs e) { if (IsPostBack) { return; } DataCatch(); } DataTable dt; int selectRow; protected void Button1_Click(object sender, EventArgs e) //編集 { Response.Redirect("~/edit.aspx"); } protected void Button2_Click(object sender, EventArgs e) //削除 { Button2.Attributes["onclick"] = "return confirm('削除しますか?');"; DataRow dr = dt.Rows[GridView1.SelectedIndex]; dr.Delete(); } protected void Button3_Click(object sender, EventArgs e) //追加 { Response.Redirect("~/edit.aspx"); } private void DataCatch() { //接続文字列を取得 string dbn = ConfigurationManager.ConnectionStrings["db"].ConnectionString; MySqlConnection cn = new MySqlConnection(dbn); cn.Open(); //SQL文と接続情報を指定しアダプタ作成 MySqlDataAdapter da = new MySqlDataAdapter("select * from ***", cn); //データ格納のためデータセット作成 DataSet dataSet = new DataSet(); //データ格納のためテーブル作成 dt = new DataTable(); dataSet.Tables.Add(dt); //取得 da.Fill(dt); cn.Close(); // GridViewとバインド GridView1.DataSource = new DataView(dt); DataBind(); } </script> <script type="text/javascript"> function winClose() { window.open('','_self').close(); } </script> <html> <body> <form id="form1" runat="server"> <div>*** <hr/> <br/> <asp:Button ID="Button1" runat="server" Text="編集" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="削除" OnClick="Button2_Click"/> <asp:Button ID="Button3" runat="server" Text="追加" OnClick="Button3_Click"/> <input type="button" onclick="winClose()" value="終了" /> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <br /> </div> <p> </p> <asp:GridView id="GridView1" runat="server" OnRowDeleting="Button2_Click" OnSelectedIndexChanged="Button2_Click" > <Columns> <asp:CommandField ShowSelectButton="True" /> </Columns> </asp:GridView> </form> </body> </html>
補足情報(FW/ツールのバージョンなど)
ASP.NET
Visual Studio2019
C#
.NET Framework4.7.2
追記(2020.7.5)
回答を受け、修正しました。
<%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="MySql.Data.MySqlClient" %> <%@ Import Namespace="System.Configuration" %> <script runat="server"> protected void Page_Load(Object source, EventArgs e) { if (IsPostBack) { return; } DataCatch(); } DataTable dt; int selectRow; protected void Button1_Click(object sender, EventArgs e) //編集 { Response.Redirect("~/edit.aspx"); } protected void Button2_Click(object sender, EventArgs e) //削除 { int selectV = (int)GridView1.SelectedValue; //delete from *** where type='@selectV'; } protected void Button3_Click(object sender, EventArgs e) //追加 { Response.Redirect("~/edit.aspx"); } private void DataCatch() { //接続文字列を取得 string dbn = ConfigurationManager.ConnectionStrings["db"].ConnectionString; MySqlConnection cn = new MySqlConnection(dbn); cn.Open(); //SQL文と接続情報を指定しアダプタ作成 MySqlDataAdapter da = new MySqlDataAdapter("select * from ***", cn); //データ格納のためデータセット作成 DataSet dataSet = new DataSet(); //データ格納のためテーブル作成 dt = new DataTable(); dataSet.Tables.Add(dt); //取得 da.Fill(dt); cn.Close(); // GridViewとバインド GridView1.DataSource = new DataView(dt); DataBind(); } </script> <script type="text/javascript"> function winClose() { window.open('', '_self').close(); } </script> <html> <body> <form id="form1" runat="server"> <div>*** <hr/> <br/> <asp:Button ID="Button1" runat="server" Text="編集" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="削除" OnClick="Button2_Click" OnClientClick="return confirm('削除しますか?')"/> <asp:Button ID="Button3" runat="server" Text="追加" OnClick="Button3_Click"/> <input type="button" onclick="winClose()" value="終了" /> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <br /> </div> <p> </p> <asp:GridView id="GridView1" runat="server" DataKeyNames="id" > <Columns> <asp:CommandField ShowSelectButton="True" /> </Columns> </asp:GridView> </form> </body> </html>
コードは ``` と ``` で囲ってください (``` はバッククォート 3 つ)。インデントされて見やすくなるので。 あと、できれば GridView のスタイル関係のコードは削除願います。
> 「選択」ボタンを押したときエラーが出てしまいました。
削除ボタンの間違いですか?
質問者さん、どのぐらい ASP.NET Web アプリの開発経験があるのでしょう? 初心者とお見受けしますが、であれば初心者マークを付けるとかその旨書くようお願いします。
コメントありがとうございます。
ご指摘いただいた点修正いたしました。
ボタンは「選択ボタン」です。選択を押すとエラーが出てしまいます。
> ボタンは「選択ボタン」です。
「選択」ボタンのクリックで dt が null になると言うエラーが出るのが解せません。コードのどの行でそのエラーが出るのですか?
DataRow dr = dt.Rows[GridView1.SelectedIndex];
でエラーになります。
そのコードは Button2 (「削除」ボタンのはず) の Click イベントのハンドラの中にあるものですよね?
そして、「選択」ボタンというのは GridView の中にある CommandField のボタンのことですよね。
だとすると、「選択」ボタンクリックで問題のコードに制御が飛んで来ることはないはず。何か特別なことをしてますか?
はい、そうです。Button2の削除ボタンにあるものです。
選択ボタンは、おっしゃる通りGridViewの中にあるCommandFieldのボタンです。
GridViewのRowDeletingとSelectedIndexChangedイベントをButton2に設定していますが関係ありますでしょうか?
話が違いますね。質問文では、
> 行の「選択」ボタンを押し、削除ボタンを押すと行が削除されるようにしたいのですが
・・・と書いてあって、2 段階で削除するのだと思ってます。違うのですか?
その通りです。
自分でコードを書くとき、いろいろと調べている段階で、イベントを追加することで削除できるのではと思考錯誤しておりました。
基本的な問題が色々あって期待通りにはいくはずがないところに、上手くいかないからよく分からないまま色々試して、事態が悪化している感じです。
大体やっていることは分かりましたので、後で解答欄に問題点と対応策を書いておきます。ちょっと問題が多いので書くのに時間がかかりそうです。少しお待ちください。
すみません。
本当にありがとうございます。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー