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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

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

Q&A

解決済

2回答

6364閲覧

javascriptでGridViewから行番号を取得する方法を教えてください。

devbgn

総合スコア22

ASP.NET

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

0グッド

0クリップ

投稿2018/11/22 10:59

編集2018/11/26 07:19

いつも拝見させていただいています。
今回asp.netで疑問が生じたため投稿させていただきました。

【問題点】
gridviewにlinkbuttonを配置し、javascriptでlinkbuttonがクリックされた
行番号を取得したいと考えています。

linkbuttonはitem templateに入れているので、RowCreateで
動的に行番号を付与しています。
下記ソースのshowGroupメソッド内でlinkbuttonがクリックされた際に
その行番号取得を試みていますが、どうもうまく取得できないでいます。

行番号の取得方法について何かアドバイスを頂けないでしょうか。
よろしくお願いします。

【ソース】

vb

1Protected Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowCreated 2 3 If e.Row.RowType = DataControlRowType.DataRow Then 4 'グリッドビュー作成時に行番号を仕込む 5 Dim lnkBtn_Search As LinkButton = CType(e.Row.FindControl("lnkBtnExchangeDate_Search"), LinkButton) 6 lnkBtn_Search.CommandArgument = e.Row.RowIndex.ToString 7 End If 8 End Sub

aspx

1<asp:GridView ID="GridView1" runat="server"> 2 <Columns> 3 <asp:TemplateField HeaderText="グループ名"> 4 <ItemTemplate> 5 <asp:LinkButton ID="lnkBtn_Search" Text='<%# Bind("GroupName") %>' runat="server" OnClientClick="return showGroup();" CommandName="ShowGroup"></asp:LinkButton> 6 </ItemTemplate> 7 <ItemStyle Width="150px" Font-Size="11" /> 8 </asp:TemplateField>

JavaScript

1function showGroup() { 2 var mordal = $find('BehaviorID_ShareGroup'); 3 mordal.show() 4 //document.getElementById("hfRecordIndex").value = ??? ←ここでhiddenに行番号を渡したい 5 document.getElementById("btnGetGridData_ShareGroup").click(); //隠しボタンを押下してクリックイベント発生 6 return false; 7}

【追記:実装したい処理について】
〇処理の全体像について
GridView1ではあるグループ情報を表示しています。
具体的にはグループ名、グループ概要、グループ作成日時、グループ作成者を表示しており、
グループ名がリンクボタンとなっております。

実装したい処理としては、このグループ名をクリックしたときモーダルウィンドウで
グループに所属しているメンバー一覧を表示したいと考えています。

そこで下記のような処理を実装したいと考えております。
1)グリッドビューのリンクボタンをクリックする
2)モーダルを表示、またhiddenに行番号を格納
3)隠しボタンを押下してクリックイベントを発生させサーバーの処理へ
4)サーバー側ではhiddenに格納した行番号を利用して
押下したグループ名をキーにメンバーを取得

※JavaScript中のbtnGetGridData_ShareGroupはモーダルに仕掛けた隠しボタンで
これjavascriptで押下することでイベントを発生させております。

【開発環境】
IDE:visual studio 2015 pro
言語:vb.net(web form)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/22 11:18

> javascriptでlinkbuttonがクリックされた 行番号を取得したいと考えています。← 「javascriptで」とはどういうことですか? 質問には JavaScript のコードは一切ありませんが????????????
退会済みユーザー

退会済みユーザー

2018/11/23 00:58 編集

上のコメントを理解いただいているでしょうか? 具体的に言うと「showGroupメソッド」の中身はどこまで書けているか、どこでつまづいているか、何が分かれば質問者さんの問題・課題が解決できるかが書いてないので、それをきちんと書いてほしいのですが。あと、「どうもうまく取得できない」では第三者には分かりません。そこを具体的に書くのが、ここに書いてないこと以外は知り得ない回答者に状況を理解してもらうために必須です。JavaScript のコードをアップして説明してもらえると分かりやすくなると思います。
退会済みユーザー

退会済みユーザー

2018/11/23 00:56

もう一つ、「GridViewから行番号を取得」とのことですが、GridView の行 Index ではなくて当該行のレコードの主キー値が必要なのではないですか? そのあたりも確認してください。全体的なシナリオ・ストーリーを含めて何をしたいのかを書いてもらえると第三者にも理解しやすいです。
devbgn

2018/11/26 01:44

三連休中、業務PCでの作業ができず返信が遅くなり申し訳ありませんでした。また上記のご指摘ありがとうございました。JavaScriptのコードを追記させていただきました。
退会済みユーザー

退会済みユーザー

2018/11/26 01:48

最初の質問にあった OnClientClick="return showGroup();" と追記した JavaScript の関数名 showShareGroup が違いますけど?
devbgn

2018/11/26 01:50

申し訳ありません。ご指摘の部分を訂正させていただきました。
退会済みユーザー

退会済みユーザー

2018/11/26 01:53

ModalPopup を使って何かしているのですか? btnGetGridData_ShareGroupr とは何ですか? 先にもお願いしましたが、全体的なシナリオ・ストーリーを含めて何をしたいのかを書いてもらえませんか? Index の渡し方だけレスしても、質問者さんが最終的にやりたいことはできないような気がしますので。
退会済みユーザー

退会済みユーザー

2018/11/26 01:56

ホントに Index の渡し方さえわかれば良い、それ以外のことは回答者には考えてもらわなくてよいということであれば、itita さんの回答を試してはいかがですか?
退会済みユーザー

退会済みユーザー

2018/11/26 02:37

全ての情報は DB にあるようですが、そうなんですか? であれば、その DB は何ですか? SQL Server? Access? その他? そして DB には「グループ」テーブルと「メンバー」テーブルがあって、「メンバー」テーブルからグループ名で検索してレコードを抽出できると理解していいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/26 02:42

そして、ページに GridView1 と GridView2 の 2 つを配置し、GridView1 には「グループ」テーブルからグループ情報の一覧を表示、GridView1 の LinkButton をクリックすると当該行のグループ名に属するメンバーを「メンバー」テーブルから抽出し GridView2 に表示するということでいいのですか?
退会済みユーザー

退会済みユーザー

2018/11/26 02:43

さらに、GridView2 は ModalPopup を使って、GridView1 の LinkButton がクリックされた時だけ表示するということですか? 以上、違ったらどこがどのように違うのか詳しく書いてください。
devbgn

2018/11/26 06:58 編集

DBについてですが、DBはsql serverを使用しています。またDBに関してSurferOnWwwさんが述べている認識で合っております。
devbgn

2018/11/26 06:59

GridView1と2の関係もご認識の通りです。私のつたない説明でかなりのところまでご理解くださりありがとうございます。
devbgn

2018/11/26 07:14 編集

また実際に動作させたかった処理ですが、ご助言の通りititaさんのコードを参考に記述したところ行番号を取得することができました。そして取得した行番号にてサーバーサイドでgridviewのグループ名を取得できました。
devbgn

2018/11/26 07:18 編集

ベストアンサーとしてはititaさんの回答がピンポイントだったので、そちらにさせていただければと思います。ただSurferOnWwwさんからいろいろご質問頂くうちに頭の中がとても整理されました。ご助言ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/11/27 03:26

質問者さんとしてはすでに解決済みかもしれませんが、GridView の Index を取得するところ、使う必要のない JavaScript を使っているところなど、見直すべきところが多々あります。今さらながらですが、そのあたりを回答欄に書いておきます。今後の参考にしていただければ幸いです。
guest

回答2

0

ベストアンサー

javascriptを引数ありにしてOnClientClickの引数に行番号を与えることで解決できると思います。
実行はしていないので、参考程度にどうぞ。

OnClientClick=<%# "return InputCheck(" + ((GridViewRow) Container).RowIndex + ");"%>

投稿2018/11/23 12:45

itita

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

devbgn

2018/11/26 07:46

>ititaさん ご回答ありがとうございました。 開発はvb.netでしたので、上記コードをvb.netに置き換えることで 狙い通り行番号を取得することができました。 ありがとうございました。
guest

0

質問者さんとしてはすでに解決済みかもしれませんが、GridView の Index を取得するところ、使う必要のない JavaScript を使っているところなど、見直すべきところが多々あります。今さらながらですが、そのあたりを書いておきます。参考にしていただければ幸いです。

まず、上の質問に対するコメントでも確認させていただきましたが、以下の (1) ~ (3) の条件で考えます。

(1) 全ての情報は DB にある。DB は SQL Server。DB には「グループ」テーブルと「メンバー」テーブルがあって、「メンバー」テーブルからグループ名で検索してグループに属するメンバーのレコードを抽出できる。

(2) ページに GridView1 と GridView2 の 2 つを配置し、GridView1 には「グループ」テーブルからグループ情報の一覧を表示、GridView1 の LinkButton をクリックすると当該行のグループ名に属するメンバーを「メンバー」テーブルから抽出し GridView2 に表示する。

(3) GridView2 は ModalPopup を使って、GridView1 の LinkButton がクリックされた時だけ表示する。

GridView1 の LinkButton クリックで当該行の Index を取得するよりは、グループ名を取得する方がよさそうです。 グループ名で「メンバー」テーブルを検索してグループに属するメンバーを抽出するわけですから。

そのためには LinkButton の CommandArgument プロパティにグループ名を設定します(質問者さんが Text プロパティに設定したのと同様に)。以下のような感じです。JavaScript は使わないので OnClientClick の設定は不要です。

<asp:TemplateField HeaderText="グループ名"> <ItemTemplate> <asp:LinkButton ID="lnkBtn_Search" runat="server" Text='<%#Eval("GroupName")%>' CommandArgument='<%#Eval("GroupName")%>'> </asp:LinkButton> </ItemTemplate> </asp:TemplateField>

メンバーを表示する GridView2 のデータソースには SqlDataSource を使い、以下のように(あくまで例です)SelectCommand, SelectParameters を設定します。

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:xxxxx %>" SelectCommand="SELECT * FROM [メンバー] WHERE ([グループ名] = @GroupName)"> <SelectParameters> <asp:Parameter Name="GruopName" Type="String" /> </SelectParameters> </asp:SqlDataSource>

GridView2 は Panel 内に実装し、ModalPopup で Panel の表示・非表示を切り替えられるようにします。

GridView1 の LinkButton をクリックするとポストバックされ、RowCommand イベントが発生します。そのハンドラの引数の GridViewCommandEventArgs オブジェクトから、上のコードで設定した CommandArgument プロパティの設定値、即ち、クリックされた行のグループ名を取得できます。

なので、以下のようにすれば期待通りの動きになるはずです。

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { string groupName = (string)e.CommandArgument; SqlDataSource2.SelectParameters["GroupName"].DefaultValue = groupName; ModalPopupExtender1.Show(); }

以下の画像は、DB に Microsoft のサンプルデータベース Northwind の Categories, Products テーブルを使った例です。

イメージ説明

投稿2018/11/27 04:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

devbgn

2018/11/28 05:50

>SurferOnWwwさん コメントありがとうございます。 まさかこんな丁寧に解説を頂けるとは。 実はSurferOnWwwさんの上記のロジックも検討はしたものの、 自力でうまく実装ができなかったため本件のロジックに至りました。 独力で解決しなくてはならない環境なのでご意見が頂けて 大変勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問