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

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

ただいまの
回答率

90.60%

  • C#

    6859questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    510questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

asp.net "Yes/No" メッセージボックス 表示

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,417

ASP.NET WebForm C# にて Webアプリケーションを作成しています。

Windows アプリケーションのような メッセージボックスを作成しようとしているのですが、
どうもできそうで、うまくできない状況です。

内容としましては、

GridView 内 にある ButtonField(追加しました)をクリックし、
Yes / No メッセージボックスを表示し
Yes ならば、label に Yes
No ならば Label に No

としたいだけなのですが、うまくできない状況です。

windows formアプリのようにいかないことは理解させていただいております。
下記を参考に、Buttonコントロール時は何とか実現できたのですが、
http://www.atmarkit.co.jp/ait/articles/0304/18/news004.html

GridView ButtonField のボタンコントロールからの実現方法で行き詰まりました。
つまりは、
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Test")
{
の場合は、
private void Page_Load(object sender, System.EventArgs e)
{
Button1.Attributes["onclick"] = "return confirm('本当に移動しますか?');"; ←ここが不明

と悩んでいます。
他の方法でもあればよいのですが、現在、解決できていない状況です。
アドバイスをいただけますと光栄です。

OS:Windows10
IIS:Windows Server 2008 R2 IIS7
.NET:4.5
VS:Visual Studio 2013

お恥ずかしいことに、TemplateField + Button を使用したことがないので参考URLなどありましたら助かります。
(もう少しいろいろと勉強しないとクリアできないのかな?)

どうかよろしくお願いします。

(追加仕様)
実施したいことが不足しており申し訳ありません。
GridView には
・ID
・ボタン
が並んでおり ボタンを押した行のIDを取得し、
Yes ならば、label に ID + Yes
と記載しなければいけない仕様であり
int rowIndex = Convert.ToInt16(e.CommandArgument);
GridView gridView = (GridView)e.CommandSource;
GridViewRow row = gridView.Rows[rowIndex];
string equNo = row.Cells[0].Text;
とイベントには記載があるのですが、1行目でエラーとなりました。
ボタンを押した行のID(値)を取得する方法は別途ありますでしょうか。

何度もすいません。
どうかよろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • SurferOnWww

    2017/09/28 21:28

    質問者さんが立てた過去スレッド 2 件が放置状態です。最後まできちんとフォローしてください。回答をもらっておきながら何も答えず放置するのはマナー的にいかがなものでしょう?

    キャンセル

  • Yamato-Suzuki

    2017/09/29 08:28

    おはようございます。業務PCによる投稿のため、この時間からの回答で申し訳ありません。

    キャンセル

回答 2

+1

案件的にAJAXControlToolkitを使って構わなければModalPopupExtenderを使ってみては
GridViewのどのItemに対して処理するかは判っているはずなので、ModalPopupExtenderに[Yes][No]のボタンを置いておいてどちらのボタンが押されたかで振る舞い(該当するItemのLabelのTextを書き換えor大元のデータソースを書き換え)を変えるだけで済みそうです

AJAXControlToolkit
ModalPopupExtender

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/29 08:37

    お恥ずかしいことに、AJAXControlToolkit をインストールしたものの、
    全然使用できずにいるところです。(ネット上のサンプルコードを入力しても動作しなかったりと、、、)
    ちょっと、この方法は敷居が高くまだ私ではよくわかっていない状況で申し訳ないです。

    キャンセル

checkベストアンサー

0

サーバー側で起こることとクライアント側で起こることの区別がついてますか?

Windows Forms アプリの MessageBox のようなサーバー側で動くものは、Web アプリ(=ブラウザ上)では表示できませんが、そのあたりの理解はよろしいでしょうか?

同等なものをブラウザ上で表示するとすれば、JavaScript / jQuery などのクライアントサイドで動くスクリプトを使うしか方法はありません。

例えば alert とか confirm など。

上記のことを十分理解した上で、

GridView 内 にある ButtonField(追加しました)をクリックし、
Yes / No メッセージボックスを表示し
Yes ならば、label に Yes
No ならば Label に No 

というところを、全体的なシナリオ・ストーリーを含めてどのようにできるかを考えてみてください。

その上で不明点があれば、全体的なシナリオ・ストーリーを含めて質問者さんのやりたいことを説明したうえで、疑問点を聞いてもらえれば、可能な限り回答します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/29 09:11

    回答ありがとうございます。
    windows formアプリのようにいかないことは理解させていただいております。
    下記を参考に、Buttonコントロール時は何とか実現できたのですが、
    http://www.atmarkit.co.jp/ait/articles/0304/18/news004.html

    GridView ButtonField のボタンコントロールからの実現方法で行き詰まりました。
    つまりは、
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
    if (e.CommandName == "Test")
    {
    の場合は、
    private void Page_Load(object sender, System.EventArgs e)
    {
    Button1.Attributes["onclick"] = "return confirm('本当に移動しますか?');"; ←ここが不明

    と悩んでいます。
    他の方法でもあればよいのですが、現在、解決できていない状況です。
    アドバイスをいただけますと光栄です。
    夜には使用できないPCのため、この時間による返信ですいません。どうかよろしくお願いします。

    キャンセル

  • 2017/09/29 09:43 編集

    上のコメントの情報は一番最初の質問に書いていただくようお願いします。情報の小出し(そのつもりはなかったかもしれませんが結果的にそうなっている)はこういうサイトでは NG です。

    あと、開発環境(OS, IIS, .NET, VS のバージョンなど)を書いてください。特に .NET のバージョンが重要です。(参考にされている記事は Button に OnClientClick がなかった古いバージョンのものです)

    それから、ButtonField の使用は必須か、代わりに TemplateField + Button でも良いのかも書いてください。

    キャンセル

  • 2017/09/29 10:12

    失礼いたしました。一番最初の質問に記載しなおします。

    キャンセル

  • 2017/09/29 11:12

    > .NET:4.5

    ASP.NET 2.0 以降なら Button や LinkButton コントロールで OnClientClick プロパティが使えますので、それに直接スクリプトを設定できます。

    > TemplateField + Button を使用したことがないので参考URLなどありましたら助かります。

    Visual Studio のデザイン画面で、GridView に表示される > ボタンをクリック ⇒ 「GridView タスク」メニューで[列の編集...]をクリック ⇒「フィールド」ダイアログの「選択されたフィールド(S)」ウィンドウ内の当該 ButtonField をクリック ⇒[このフィールドを TemplateField に変換します。]をクリックで自動的に変換してくれます。

    ButtonField でなく TemplateField + Button を使用する理由は OnClientClick プロパティに直接アクセスできるからです。

    TemplateField に変換できたら、その中の Button を選択してプロパティウィンドウを開き、OnClientClick プロパティに以下のように設定すれば望む結果になるはずです。

    return confirm('本当に移動しますか?');

    不明な点があれば聞いてください。

    キャンセル

  • 2017/09/29 12:02 編集

    知らないうちに質問欄に追記されたようですが、そういうのはダメです。回答者が気付かないだけでなく、後で検索などでここを訪れた人にとって訳が分からなくなります。このサイトは、質問者さん専用の Q&A サイトではなく、know-how の蓄積も目的としているそうですので、後で訪れた人のことも考える必要があるはずですので。

    まず、上の私のコメントに対して返答してください。上のコメントに従ってどこまで実装できたのかをきちんと書いてください。

    その上で追加の質問があれば、コメント欄に書いてください。スペースの問題やコードを書きたいなどの理由で回答欄に書く場合は、そのことが分かるように(コメント欄に質問欄に記入する旨一言述べるなど)してください。

    キャンセル

  • 2017/09/29 12:39

    不慣れですいません。
    >ButtonField でなく TemplateField + Button を使用する理由は OnClientClick プロパティに直接アクセスできるからです。
    TemplateField に変換できたら、その中の Button を選択してプロパティウィンドウを開き、OnClientClick プロパティに以下のように設定すれば望む結果になるはずです。
    return confirm('本当に移動しますか?');

    →ここまでは完成できました。この後、上記に記載しました(追加仕様)を実施しましたところ、エラーで停止してしましました。
    もし解決方法があれば、光栄です。
    ※このような記載でよろしかったでしょうか?ご不備ありましたら、ご指摘ください。
    よろしくお願いいたします。

    キャンセル

  • 2017/09/29 13:22 編集

    GridView 内のボタンをクリックすると「本当に移動しますか?」というメッセージが表示され[OK][キャンセル]という 2 つのボタンが表示される。[OK]をクリックするとポストバックされる、[キャンセル]をクリックすると何も起こらない・・・というところまでは実装できたと理解します。

    そして、追加仕様でやりたいことは、[OK]がクリックされたときは、ポストバックされたときにサーバー側で当該行のレコードの ID(何だか不明ですが)を取得し、Labal.Text に取得した ID の値を設定し、ブラウザに表示するということができればいいのですか? そして、[キャンセル]がクリックされたときは何もしないということでいいのですか?

    であれば、

    > とイベントには記載があるのですが、1行目でエラーとなりました。
    > ボタンを押した行のID(値)を取得する方法は別途ありますでしょうか。

    の「イベント」とは何か、「ID」とは何かを具体的に、掲示板に書かれていること以外は知り得ない第三差に分かるように書いてください。(想像で答えて、その想像が間違っていると混乱を招くばかりですので)

    キャンセル

  • 2017/09/29 14:10

    ご回答ありがとうございます。
    OK → ポストバックするため GridView1_RowCommand イベントが起動する
    キャンセル → 何も起こらない
    こと実装確認できました。ありがとうございます。

    あとは、Labelに記載するのですが、
    GridView には、それぞれ各行にユニークな番号(ID)が記載(データベースより表示)されておりますので、ボタンクリックした行の番号(ID)をよみ、Labelに表示したいところです。
    GridViewのイメージとして
    ID101 ボタン
    ID102 ボタン
    ID103 ボタン
    ID104 ボタン
    ID105 ボタン
    となっており、ボタンを押した同じ行のIDを読み込み
    Labelに表示できればと思っています。
    不慣れで説明不十分ご容赦ください。記載方法に不備がありましたら訂正します。
    以上、よろしくお願いします。

    キャンセル

  • 2017/09/29 15:47

    ButtonField でなく TemplateField + Button を使用すると Button の CommandArgument プロパティにも直接アクセスできるようになります。

    なので、ID をデータベースから取得して GridView にデータバインドしているのであれば、データバインド式で ID の値を取得して CommandArgument に設定できます。

    具体的には、ソース画面で見て、Button のプロパティに以下を追加します。

    CommandArgument='<%# Eval("ID")%>'

    そうすれば、RowCommand イベントのハンドラで、(string)e.CommandArgument として ID の値の文字列が取得できると思います。お試しください。

    キャンセル

  • 2017/09/29 16:41

    できました。まさしく狙っていた動きであります。
    とても感激です。本当にありがとうございます。
    この後の記述など、ご不備がありましたら何なりとご指摘ください。

    キャンセル

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

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

関連した質問

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

  • C#

    6859questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    510questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。