C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: ADO.NET(削除・挿入時) 確認メッセージの表示


(過去ログ 126 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■74747 / inTopicNo.1)  ADO.NET(削除・挿入時) 確認メッセージの表示
  
□投稿者/ とし (7回)-(2015/01/27(Tue) 17:01:45)

分類:[ASP.NET (VB)] 

環境は以下の環境で行っています。
2003Server,IIS V6.0,Access2000,IE8
ASP.NET開発: Visual Web Developer2010

以前にADO.NET ライブラリで直接Accessに挿入INSERTクエリ操作する質問をさせて頂いて
削除DELETEのパターンもうまくいったのですが・・・

挿入・削除の処理前に確認のメッセージ(OK・キャンセル)を表示して処理の分岐をしたいのですがうまくいきません。


Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs)

If e.CommandName = "Delete" Then

     ここで、確認メッセージを表示してOKなら以下にある削除処理を実行させたい


通常のGridViewでは削除ボタンをTemplateにしてOnClientClickプロパティに
return confirm('本当に削除しても良いですか?');
をセットする方法でやっていたのですが・・・
この方法では
選択した行情報の取得時にエラー

Dim rowIndex As Integer = Convert.ToInt16(e.CommandArgument) ←エラー行
Dim gridView As GridView = DirectCast(e.CommandSource, GridView)
Dim row As GridViewRow = gridView.Rows(rowIndex)

Dim Seq As String = row.Cells(1).Text
      以下略

入力文字列の形式が正しくありません。
のエラーメッセージが表示されます。

確認メーセージボックスの表示がわかれば教えて頂きたいのですが

宜しくお願いします。
引用返信 編集キー/
■74751 / inTopicNo.2)  Re[1]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ shu (680回)-(2015/01/27(Tue) 17:19:33)
No74747 (とし さん) に返信

クライアント側の処理で確認を行ってからポストバックするようにすれば
どうでしょう?


以下のサイトにあるのはボタンのクリックに対し処理前にクライアントで確認する内容のです。
参考にしてみて下さい。
http://www.atmarkit.co.jp/fdotnet/dotnettips/015confirm/confirm.html
引用返信 編集キー/
■74754 / inTopicNo.3)  Re[1]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ WebSurfer (478回)-(2015/01/27(Tue) 18:16:49)
No74747 (とし さん) に返信

クライアントのブラウザで起こっていることと、サーバーの VB.NET のプログラム
で起こっていることの区別が付いていないのでは?

> Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As > System.Web.UI.WebControls.GridViewCommandEventArgs)
>
> If e.CommandName = "Delete" Then
>
>     ここで、確認メッセージを表示してOKなら以下にある削除処理を実行させたい

それはポストバックされてサーバー側で動いているコードです。なので、クライア
ントのブラウザ上で「確認メッセージを表示して・・・」は基本的に無理です。

何を確認したいのか、掲示板に書いてあること以外は何も知り得ない回答者に分か
るように書いていただけませんか。そうしていただけると案が出せるかもしれませ
ん。

> Dim rowIndex As Integer = Convert.ToInt16(e.CommandArgument) ←エラー行

それは上記とは別の問題のように思いますが。デバッガで e.CommandArgument を
見てください。ToInt16 メソッドの引数として適切ですか?

引用返信 編集キー/
■74760 / inTopicNo.4)  Re[2]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ PANG2 (55回)-(2015/01/28(Wed) 09:18:39)
> 通常のGridViewでは削除ボタンをTemplateにしてOnClientClickプロパティに
> return confirm('本当に削除しても良いですか?');
> をセットする方法でやっていたのですが・・・

OKならポストバックして、RowCommandイベントが発生する。
キャンセルならポストバックせず、RowCommandイベントが発生しない。
よってRowCommandイベントで分岐する必要がない。
表題の質問は解決済みに見えますが..



> この方法では
> 選択した行情報の取得時にエラー


RowCommandイベントで行番号を取得する方法がわからないということですか?

http://www.atmarkit.co.jp/fdotnet/dotnettips/830aspgridvwcmdbtn2/aspgridvwcmdbtn2.html
引用返信 編集キー/
■74765 / inTopicNo.5)  Re[3]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ とし (10回)-(2015/01/28(Wed) 15:02:07)
No74760 (PANG2 さん) に返信
>>通常のGridViewでは削除ボタンをTemplateにしてOnClientClickプロパティに
>>return confirm('本当に削除しても良いですか?');
>>をセットする方法でやっていたのですが・・・
>
> OKならポストバックして、RowCommandイベントが発生する。
> キャンセルならポストバックせず、RowCommandイベントが発生しない。
> よってRowCommandイベントで分岐する必要がない。
> 表題の質問は解決済みに見えますが..
>
>
>
>>この方法では
>>選択した行情報の取得時にエラー
>
>
> RowCommandイベントで行番号を取得する方法がわからないということですか?
>
> http://www.atmarkit.co.jp/fdotnet/dotnettips/830aspgridvwcmdbtn2/aspgridvwcmdbtn2.html


回答を頂いた皆様ありがとうございます。

確かにやりたい事は
クライアント側の処理で確認メッセージ(OK・キャンセル)表示
・OKならポストバックして、RowCommandイベントが発生する。
・キャンセルならポストバックせず、RowCommandイベントが発生しない。
です。
RowCommandイベント中に表示するのは間違えですね

GridViewの削除ボタン(ButtonField)をTemplateにしてOnClientClickプロパティに
return confirm('本当に削除しても良いですか?');
を設定すると確認メッセージが表示され
キャンセルすると処理が停止(OK)
OKすると最初に記述した所でエラーとなります。

OnClientClickプロパティに
return confirm('本当に削除しても良いですか?');
を設定
以外に確認メッセージを表示する方法はありますか?

shuさんに回答頂いたURLを拝見しましたが
GridViewの行の中に削除ボタンがあるので出来るのでしょうか?
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="SEQ,原価センタコード,工程ID" DataSourceID="AccessDataSource1"
onrowcommand="GridView1_RowCommand">
<Columns>
<asp:ButtonField ButtonType="Button" CommandName="Delete" Text="削除" />
<asp:BoundField DataField="SEQ" HeaderText="SEQ" SortExpression="SEQ"
ReadOnly="True" InsertVisible="False" />
    以下略

宜しくお願いします。



引用返信 編集キー/
■74766 / inTopicNo.6)  Re[4]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ WebSurfer (479回)-(2015/01/28(Wed) 15:23:06)
No74765 (とし さん) に返信

前のレスでも書きましたが、

> Dim rowIndex As Integer = Convert.ToInt16(e.CommandArgument) ←エラー行

のエラーの原因は、

> OnClientClickプロパティに
> return confirm('本当に削除しても良いですか?');
> を設定

とは関係ないです。

先に「デバッガで e.CommandArgument を見てください。ToInt16 メソッドの引数とし
て適切ですか?」と書きましたが、見てもらえましたか?


> DataKeyNames="SEQ,原価センタコード,工程ID"

連結主キーですか? テーブルのスキーマはどうなってます?
引用返信 編集キー/
■74793 / inTopicNo.7)  Re[5]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ とし (11回)-(2015/01/29(Thu) 15:22:41)
No74766 (WebSurfer さん) に返信
> ■No74765 (とし さん) に返信
>
> 前のレスでも書きましたが、
>
>>Dim rowIndex As Integer = Convert.ToInt16(e.CommandArgument) ←エラー行
>
> のエラーの原因は、
>
>>OnClientClickプロパティに
>>return confirm('本当に削除しても良いですか?');
>>を設定
>
> とは関係ないです。
>
> 先に「デバッガで e.CommandArgument を見てください。ToInt16 メソッドの引数とし
> て適切ですか?」と書きましたが、見てもらえましたか?
>
>
>>DataKeyNames="SEQ,原価センタコード,工程ID"
>
> 連結主キーですか? テーブルのスキーマはどうなってます?

WebSurferさんありがとうございます。

デバッガは使用した事がないので内容がこれでいいのかわかりませんが・・・

e.CommandArgumentの中身は

メッセージを表示しない場合
- e {System.Web.UI.WebControls.GridViewCommandEventArgs} System.Web.UI.WebControls.GridViewCommandEventArgs
- CommandArgument "0" {String} Object
String "0" String

メッセージを表示してOKした場合
- e {System.Web.UI.WebControls.GridViewCommandEventArgs} System.Web.UI.WebControls.GridViewCommandEventArgs
- CommandArgument "" {String} Object
String "" String


OnClientClickプロパティに
return confirm('本当に削除しても良いですか?');
を設定
とは関係ないです。

とありますが
設定しないとエラーにならないので関係ありそうですが・・・?


主キーは
連結主キー(SEQ,原価センタコード,工程ID)です。


ちなみに
GridViewの削除を有効にする。
で普通に削除出来ればado.netでコードを書いて削除しなくても良いのですが・・・
削除されないので仕方なくこの方法でやってます。
(削除されない原因もデバッガを使えば判明するのでしょうか?)


宜しくお願いします。

引用返信 編集キー/
■74795 / inTopicNo.8)  Re[6]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ WebSurfer (481回)-(2015/01/29(Thu) 16:43:58)
No74793 (とし さん) に返信

> メッセージを表示しない場合

上記は ButtonField を使った場合のことを言っているのですよね?

> メッセージを表示してOKした場合

そして、上記は ButtonField に代えて TemplateField 内に Button コントロールを
配置(または、デザイナ画面で[このフィールドを TemplateField に変換します]で
変換)したときのことを言っているのですよね?

その理解が正しいとしてレスします。

前者のボタンの CommandArgument プロパティには、GridView 上でそのボタンのある
行の RowIndex が自動的に設定されます。

「メッセージを表示しない場合」の結果 "0" は GridView の 1 行目にあるボタンを
クリックしたものだと思いますが、2 行目、3 行目のボタンをクリックするとそれぞ
れ "1"、"2" となるはずです。

なので、Convert.ToInt16(e.CommandArgument) は期待通りの結果になります。(今回
の問題とは別の話ですが、ホントは ToInt32 が正しいです)

一方、後者の場合、ボタンの CommandArgument プロパティには自動的には何も設定さ
れません。なので、どの行のボタンをクリックしても e.CommandArgument は空白すな
わち "" になります。

Convert.ToInt16(e.CommandArgument) の引数 e.CommandArgument が "" になった結果、
例外 "System.FormatException: 入力文字列の形式が正しくありません。" がスローさ
れたということです。

解決策は、

(1) TemplateField + Button を使うのであれば、その Button の CommandArgument プ
ロパティに自力で GridView の RowIndex を設定する、または、

(2) 以前のように ButtonField を使うのであれば、それから生成される Button コント
ロールの OnClientClick にクライアントスクリプト confirm(...) を設定する、また
は、

(3) Delete するには該当するレコードの主キーさえ分かればいいので、GridView の
RowDeleting イベントのハンドラの引数 GridViewDeleteEventArgs オブジェクトの
Keys プロパティで主キー値を取得し、それを使って DELETE をかける。

・・・が考えられます。

上記の具体的な方法が分からなければまたここで聞いてください。
引用返信 編集キー/
■74815 / inTopicNo.9)  Re[7]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ とし (12回)-(2015/01/30(Fri) 16:34:26)
No74795 (WebSurfer さん) に返信
> ■No74793 (とし さん) に返信
>
>>メッセージを表示しない場合
>
> 上記は ButtonField を使った場合のことを言っているのですよね?
>
>>メッセージを表示してOKした場合
>
> そして、上記は ButtonField に代えて TemplateField 内に Button コントロールを
> 配置(または、デザイナ画面で[このフィールドを TemplateField に変換します]で
> 変換)したときのことを言っているのですよね?
>
> その理解が正しいとしてレスします。
>
> 前者のボタンの CommandArgument プロパティには、GridView 上でそのボタンのある
> 行の RowIndex が自動的に設定されます。
>
> 「メッセージを表示しない場合」の結果 "0" は GridView の 1 行目にあるボタンを
> クリックしたものだと思いますが、2 行目、3 行目のボタンをクリックするとそれぞ
> れ "1"、"2" となるはずです。
>
> なので、Convert.ToInt16(e.CommandArgument) は期待通りの結果になります。(今回
> の問題とは別の話ですが、ホントは ToInt32 が正しいです)
>
> 一方、後者の場合、ボタンの CommandArgument プロパティには自動的には何も設定さ
> れません。なので、どの行のボタンをクリックしても e.CommandArgument は空白すな
> わち "" になります。
>
> Convert.ToInt16(e.CommandArgument) の引数 e.CommandArgument が "" になった結果、
> 例外 "System.FormatException: 入力文字列の形式が正しくありません。" がスローさ
> れたということです。
>
> 解決策は、
>
> (1) TemplateField + Button を使うのであれば、その Button の CommandArgument プ
> ロパティに自力で GridView の RowIndex を設定する、または、
>
> (2) 以前のように ButtonField を使うのであれば、それから生成される Button コント
> ロールの OnClientClick にクライアントスクリプト confirm(...) を設定する、また
> は、
>
> (3) Delete するには該当するレコードの主キーさえ分かればいいので、GridView の
> RowDeleting イベントのハンドラの引数 GridViewDeleteEventArgs オブジェクトの
> Keys プロパティで主キー値を取得し、それを使って DELETE をかける。
>
> ・・・が考えられます。
>
> 上記の具体的な方法が分からなければまたここで聞いてください。

WebSurfer さん
いつもありがとうございます。

その理解が正しいとして(正しいです。)

(1)の案でやってみました。
検索して以下の方法で行数を取得して
Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim btn As Button = CType(e.Row.FindControl("Button1"), Button)
btn.CommandArgument = e.Row.RowIndex.ToString
End If
End Sub

削除一覧を2行にして2行目を削除してみました。

e.CommandArgumentデバッグ内容は
e {System.Web.UI.WebControls.GridViewCommandEventArgs} System.Web.UI.WebControls.GridViewCommandEventArgs
CommandArgument "1" {String} Object
String "1" String
CommandName "Delete" String
"1"が入る様になったのですが・・・

今度は下記の所でエラーになりました。
Dim rowIndex As Integer = Convert.ToInt32(e.CommandArgument)←ToInt32に変更しました。
Dim gridView As GridView = DirectCast(e.CommandSource, GridView) ←エラー行
Dim row As GridViewRow = gridView.Rows(rowIndex)

型 'System.Web.UI.WebControls.Button' のオブジェクトを型 'System.Web.UI.WebControls.GridView' にキャストできません。

対策が全然解りません。
原因と対策解りますでしょうか?
宜しくお願い致します。



引用返信 編集キー/
■74816 / inTopicNo.10)  Re[8]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ WebSurfer (486回)-(2015/01/30(Fri) 17:19:33)
No74815 (とし さん) に返信

> Dim gridView As GridView = DirectCast(e.CommandSource, GridView) ←エラー行
> ・・・略・・・
> 型 'System.Web.UI.WebControls.Button' のオブジェクトを型 'System.Web.UI.WebControls.GridView'
> にキャストできません。

TemplateField + Button を使った場合は e.CommandSource は GridView ではなく Button に
なるからです。

一番最初の質問の時と同様に GridView.RowCommand イベントのハンドラで処置しているのなら、
その引数の sender が GridView になりますので、e.CommandSource に代えて sender を使えば
ボタンクリックした GridView の行の GridViewRow を取得できると思います。

引用返信 編集キー/
■74817 / inTopicNo.11)  Re[8]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ PANG2 (57回)-(2015/01/30(Fri) 18:30:43)
> Dim gridView As GridView = DirectCast(e.CommandSource, GridView) ←エラー行
> Dim row As GridViewRow = gridView.Rows(rowIndex)

Dim row As GridViewRow = GridView1.Rows(rowIndex)

と書くのが普通かな
引用返信 編集キー/
■74818 / inTopicNo.12)  Re[9]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ WebSurfer (487回)-(2015/01/30(Fri) 18:35:12)
No74817 (PANG2 さん) に返信

> と書くのが普通かな

一つの方法ではあると思いますが「普通」かどうかは議論のあるところだと思います。
引用返信 編集キー/
■74851 / inTopicNo.13)  Re[10]: ADO.NET(削除・挿入時) 確認メッセージの表示
□投稿者/ とし (13回)-(2015/02/02(Mon) 14:55:11)
No74818 (WebSurfer さん) に返信
> ■No74817 (PANG2 さん) に返信
>
>>と書くのが普通かな
>
> 一つの方法ではあると思いますが「普通」かどうかは議論のあるところだと思います。

WebSurfer さん
PANG2 さん
ありがとうございます。

教えて頂いた内容で修正したら正常に動作しました。
今回はこれで解決しました。

今、作成しているシステムはまだ完成ではないのでまた解らない事が出て来たら
ご協力頂けたら助かります。
その時は宜しくお願い致します。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -