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

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

新規登録して質問してみよう
ただいま回答率
85.37%
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ASP.NET

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

Q&A

解決済

2回答

5377閲覧

C# Repeaterの中にバインドした値を取得したい

sky_

総合スコア11

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ASP.NET

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

0グッド

0クリップ

投稿2017/09/18 17:10

編集2017/09/19 16:31

###前提・実現したいこと
visual studio 2017 C# で簡易的な掲示板を作成しています。
C#の知識は浅く、躓きまくってます。
repeaterで出力した値を取得したいのですが調べてもなかなかヒットせず質問に至りました。

※掲示板の投稿一覧を作成しているところです。
###表示側ソースコード

C#

1 <asp:Panel ID="Panel2" runat="server" style="width:auto" BorderColor="#FF9900" BorderStyle="Solid"> 2 3 <asp:Literal ID="lResult" runat="server"></asp:Literal> 4 <asp:Repeater ID="rBoard" runat="server" OnItemCommand="rBoard_ItemCommand"> 5 <HeaderTemplate> 6 <table> 7 </HeaderTemplate> 8 <ItemTemplate> 9 <tr> 10 <!-- No --> 11 <td><%# DataBinder.Eval(Container.DataItem, "No") %></td> 12 <!-- 名前 --> 13 <td><%# DataBinder.Eval(Container.DataItem, "Name") %></td> 14 <!-- 日付 --> 15 <td><%# DataBinder.Eval(Container.DataItem, "Time") %></td> 16 <!-- ID --> 17 <td><%# DataBinder.Eval(Container.DataItem, "Id") %></td> 18 </tr> 19 <tr> 20 <!-- タイトル --> 21 <td><%# DataBinder.Eval(Container.DataItem, "Title") %></td> 22 </tr> 23 <tr> 24 <!-- 本文 --> 25 <td><%# DataBinder.Eval(Container.DataItem, "Sentence") %></td> 26 </tr> 27 <tr> 28 <td></td> 29 <td></td> 30 <td></td> 31 <td><asp:LinkButton ID="lbEdit" runat="server">編集</asp:LinkButton></td> 32 </tr> 33 34 </ItemTemplate> 35 <FooterTemplate> 36 </table> 37 </FooterTemplate> 38 </asp:Repeater> 39 </asp:Panel>

###補足情報(言語/FW/ツール等のバージョンなど)

<!-- No --> <td><%# DataBinder.Eval(Container.DataItem, "No") %></td> ↑に値を入れ込むことはできているのですが、この値を取得する方法がわかりません。 ※追記 編集ボタンがクリックされたときに何行目のNoなのかを取得したいです。 ------------ 補足 .netのバージョンは4.5.2です。 repeaterは必須でよろしくお願いします。 何か補足がいるようでしたらコメントください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/09/18 23:49

asp.net の話のようですが、であれば asp.net のタグをつけてください。
退会済みユーザー

退会済みユーザー

2017/09/18 23:53

あと、使用可能な .net のバージョン、repeater を使うのは必須なのかも書いてください。
sky_

2017/09/19 13:25

修正いたしました。
退会済みユーザー

退会済みユーザー

2017/09/19 15:07

asp.net の話のようですが、であれば asp.net のタグをつけてください。「repeaterは必須」というところを考え直さないと「掲示板の投稿画面を作成」は無理と思いますが・・・
sky_

2017/09/19 15:20

タグ付けしました。投稿画面ではなく投稿一覧画面でした。一覧画面でしたらrepeaterを使用して実現可能でしょうか?
退会済みユーザー

退会済みユーザー

2017/09/20 00:44

マルチポストの意味が分からなければ「マルチポスト」をキーワードにググってヒットする記事を 2, 3 読んでみてください。いろいろな意見があるようですが、まず歓迎はされません。
guest

回答2

0

コメントでも書きましたが、

num = e.Item.ItemIndex+1; これで欲しい値を取得できました。

それでは問題ありだと思います。今回たまたまそれで OK だったかもしれませんが、普通に掲示板で一覧表示している場合を考えたらどうでしょうか? 以下のようなケースがあると、とたんに破綻するはずです。

(1) No の大きい順(多分一番 No の大きい投稿が最新)に表示する。
(2) 投稿の削除などで No が飛んでいる。
(3) ページングを行う。

なので、質問者さんの本来の質問、

編集ボタンがクリックされたときに何行目のNoなのかを取得したいです

に答えるため、ベストアンサーを得た方に、その回答の中の、

ボタンの CommandArgument に バインドされたIDを渡して

のところを具体的に書いていただくようお願いしたのですが、お願いを聞いていただけなかったので、代わって私が案を書きます。

問題は LinkButton.CommandArgument に No をどのように渡すかですが、ItemDataBound で行うのがよさそうです。

具体例は以下のコードおよびそれに付与したコメントを見てください。

自分の持っている既存のサンプルをそのままコピペしたので質問者さんの例とは名前が異なります。Repeater1 ⇒ rBoard、LinkButton1 ⇒ lbEdit、EmployeeID ⇒ No と読み替えてください。

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { // ヘッダ、フッタを含め全行でイベントが発生するので、データ行のみで以下の // 操作を行うよう if 文で判定。AlternatingItem の判定も必要 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { // DataTable をバインドすると e.Item.DataItem で DataRowView を取得できる DataRowView view = (DataRowView)e.Item.DataItem; // 当該行の中の LinkButton を探す LinkButton button = (LinkButton)e.Item.FindControl("LinkButton1"); // LinkButton が取得できたら、 if (button != null) { // 他の Button(もしあれば)と区別するため CommandName を設定 button.CommandName = "Edit"; // CommandArgument に当該レコードを識別できる主キーなどのデータを設定 button.CommandArgument = view["EmployeeID"].ToString(); } } } protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) { string name = e.CommandName; string arg = (string)e.CommandArgument; }

あと、コメントにも書きましたが、No が主キーではないとすると(Id が主キーのように見えます)、No を取得することがホントに適切か(Id を取得すべきだはないか)も考えた方がよさそうです。

投稿2017/09/21 04:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

何行目か であればクリックされた時のイベント

C#

1protected void rBoard_ItemCommand(object source, RepeaterCommandEventArgs e)

で e.Item.ItemIndex
から取れます。

ただ、ボタンを押したときに 紐づいた番号を知りたければ
ボタンの CommandArgument に バインドされたIDを渡して
e.CommandArgument
でとるのが よくある使い方です。

投稿2017/09/20 13:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sky_

2017/09/20 14:14

e.Item.ItemIndex だけだと欲しい値-1が出力されたので num = e.Item.ItemIndex+1; これで欲しい値を取得できました。
退会済みユーザー

退会済みユーザー

2017/09/21 01:05 編集

質問者さん> > num = e.Item.ItemIndex+1; これで欲しい値を取得できました。 それでは問題ありだと思います。今回たまたまそれで OK だったかもしれませんが、普通に掲示板で一覧表示している場合はどうでしょう? 以下のようなケースがあると、とたんに破綻するはずです。 (1) No の大きい順(多分一番 No の大きい投稿が最新)に表示する。 (2) 投稿の削除などで No が飛んでいる。 (3) ページングを行う。 あと、No が主キーではないとすると(ID が主キーのように見える)、ホントに No を取得することが適切かも考えた方がよさそうです。 今時 repeater を使っているということは研修の課題などではないかと想像してますが、だとすると合格点はもらえないかも。
退会済みユーザー

退会済みユーザー

2017/09/21 01:11

noricyan2 さん> このサイトは know-how の蓄積を目的としているそうですので、今後検索などでここを訪れる人などのために、 > ボタンの CommandArgument に バインドされたIDを渡して あたりまで書いていただけると幸いです。
退会済みユーザー

退会済みユーザー

2017/09/21 01:54

質問者様が どうやるのですかと来れば書く気はありました。 しかし、そもそもでいえば おっしゃる通りあまり筋のよいやり方ではないためということもありますが、 何でも聞かれる前に、すべて提示するのもどうかなと個人的には思いますし、貴方の提示された懸念事項もご自分で気づいてほしいと自分は考えます。 サイトの趣旨として、質問者が求めていなくても周辺まで広げてなるべく多くの情報を回答すべきなのでしょうか。ここでやり取りすべきではないかもしれませんが、自分は実際に人にするように回答すべきと思っています。 ともあれご教授ありがとうございました。今後の回答の参考に致します。
退会済みユーザー

退会済みユーザー

2017/09/21 02:07

質問には明確に、 > 何行目のNoなのかを取得したい と書いてあります。なので、noricyan2 さんが言われる、 > ボタンの CommandArgument に バインドされたIDを渡して は回答として求められている範囲に入ると思います。なので、それを具体的に書いた方が良いと思うのですが・・・ もし書く気がないと言われるのでしたら私が書きますが、どうしますか?
退会済みユーザー

退会済みユーザー

2017/09/21 02:25

より良い回答をなされるのに、他人に気を遣う必要はありません。 今後もこのような遠回しな回答修正を強いられるのあれば、回答するのを遠慮したいと思います。
退会済みユーザー

退会済みユーザー

2017/09/21 03:03

修正をお願いしたのではなくて、noricyan2 さんがすでに回答した、 > ボタンの CommandArgument に バインドされたIDを渡して のあたりを詳しく書いていただけると幸いですと言ったのですが? あなたが回答して、あなたの回答にベストアンサーが付いているのですから、そこは気を使いますよ。少なくとも自分は。 自分は、自分が関わったスレッドで、自分のレスが質問者さん以外の閲覧者にも少しでも役に立てば嬉しいです。 noricyan2 さんも、回答を補足することで、ご自分の回答がより有用になれば Happy ではないかと思ったのですが、どうでしょう?
退会済みユーザー

退会済みユーザー

2017/09/21 03:08

私は貴方ではありません。貴方とは違うことを考えますし、嬉しいとかそういう基準も違うものです。 分かっていただけなかったようですし、今後も続くことを考えると大変億劫です。これを限りにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問