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

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

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

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

ASP.NET

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

Q&A

解決済

1回答

5188閲覧

バインドした値を使って動的にコントロールのIDを指定したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

ASP.NET

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

0グッド

0クリップ

投稿2020/08/28 08:30

編集2020/08/31 01:57

動作環境
OS windows10
Visualstudio ver15.9.17

目的・やりたいこと
Repeterコントロールを使って動的にIDを設定したい。

実施したこと
Repeaterを使ってバインドしたデータをIDに設定したが、以下のエラーが出て設定できません。
『コントロールIDプロパティは、タグ及び単一の値でID属性を使用してのみ設定できます。』

aspx

1<repeater ID="DataList"> 2<itemtemplate> 3 <asp:CheckBox id=<%# DataBIndr.Eval(container.DataItem,データクラスのプロパティ名)%> runat = "sever" clientIDmode = "static"/> 4</itemtemplate> 5</repeater>

C#

1DataList.DataSource = <データクラスオブジェクトのリスト> 2DataList.DataBind();

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

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

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

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

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

y_waiwai

2020/08/28 08:35

コードを提示しましょう
退会済みユーザー

退会済みユーザー

2020/08/28 08:55

業務コードなので簡略化していますが記載いたしました。
退会済みユーザー

退会済みユーザー

2020/08/28 10:20

開発環境(OS, .NET Framework, Visual Studio のバージョンなど)は必ず書いてください。
退会済みユーザー

退会済みユーザー

2020/08/28 10:22

> Repeaterを使ってバインドした値をIDに設定したいのですが 「バインドした値」って何ですか? 意味不明ですよ。 > ※スマホからなので雑になっています。 ホントに雑ですよ。他人に聞くのに「雑」というのは大変失礼だと思いませんか? 書き直してください。
退会済みユーザー

退会済みユーザー

2020/08/31 01:58

申し訳ございません。 修正しましたので確認していただければと思います。
退会済みユーザー

退会済みユーザー

2020/08/31 02:08 編集

> DataList.DataSource = <データクラスオブジェクトのリスト> 「<データクラスオブジェクトのリスト>」とは具体的にどういうものですか?
退会済みユーザー

退会済みユーザー

2020/08/31 02:26

データ格納用のプロパティのみのクラスオブジェクトのリストになります。
退会済みユーザー

退会済みユーザー

2020/08/31 02:34 編集

> データ格納用のプロパティのみのクラスオブジェクトのリストになります。 具体例(コード)を質問欄を編集して追記してください。List<T> 型のオブジェクトで、T が質問者さんが定義したカスタムクラスで、そのカスタムクラスの中に CheckBox の ID に設定したいデータを取得するプロパティが含まれているのではなかろうかと想像していますが、その想像で返事して、想像が間違っていると混乱を招くばかりですので。
退会済みユーザー

退会済みユーザー

2020/08/31 08:51

質問者さん、無言になってしまいましたが、回答したのでそれに対するフィードバックを回答欄のコメントに書いてください。役に立った/立たなかったぐらいはあまり時間をかけずに回答できるのでは? 役に立たなかった場合はどこがダメだったか書いてもらえると別の回答が出せるかも。とにかく無言は NG です。
退会済みユーザー

退会済みユーザー

2020/09/01 01:50

具体例を回答欄に追記しておきました。必ず回答に対するフィードバックを書いてください。
guest

回答1

0

ベストアンサー

質問に対するコメントに返事がありませんが・・・

Repeater のデータソースは List<T> 型のオブジェクトで(T は質問者さんが定義したカスタムクラス)、T の中に CheckBox の ID に設定したい文字列データが含まれていて、そのデータを取得するプロパティが T に含まれているのであろうと想像してレスします。

上の想像が違っていたらどこがどう違うのか下のコメント欄に書いてください。

データバインド式を使って ID='<%# Eval("CheckBoxId") %>' のように ID を設定することはできないので(質問者さんが経験したエラーになる)、Repeater.ItemDataBound イベントのイベントハンドラで設定するほかなさそうです。

イベントハンドラの引数 RepeaterItemEventArgs の Item プロパティで RepeaterItem を取得し、その中に含まれるコントロールの中から CheckBox を探して、その ID プロパティに T クラスに含まれる文字列データを設定するようにしてみてください。

【2020/9/1 追記】

上のように言っておいて、もしできなかったら何ですので検証してみました。検証に使ったコードと結果の画像を貼っておきます。上の回答で書いた List<T> 型のオブジェクトというのは下の .aspx.cs の CreateDataSource メソッドで作られる List<SampleData> で、List<T> の T クラスは SampleData になります。

.aspx.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class WebForm9 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Repeater1.DataSource = CreateDataSource(); Repeater1.DataBind(); } } protected List<SampleData> CreateDataSource() { var list = new List<SampleData>(); for (int i = 0; i < 5; i++) { var data = new SampleData { Id = i, Name = "Name-" + i, Price = 100m * (i + 1), CheckBoxId = "CheckBox" + i }; list.Add(data); } return list; } protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { foreach (Control ctrl in e.Item.Controls) { if (ctrl is CheckBox) { ((CheckBox)ctrl).ID = ((SampleData)e.Item.DataItem).CheckBoxId; break; } } } } } public class SampleData { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string CheckBoxId { get; set; } } }

.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm9.aspx.cs" Inherits="WebApplication1.WebForm9" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <style type="text/css"> table.style1 { border-style: solid; border-width: 2px; border-color: Black; text-align: center; border-collapse: collapse; } table.style1 th { border-style: solid; border-width: 2px 1px 2px 1px; border-color: Black; background-color: #6699FF; color: #FFFFFF; } table.style1 td { border-style: solid; border-width: 1px; border-color: Black; } </style> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"> <HeaderTemplate> <table class="style1"> <tr> <th>ID</th> <th>Name</td> <th>Price</th> <th>Check</th> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><%# Eval("ID")%></td> <td><%# Eval("Name")%></td> <td><%# Eval("Price")%></td> <td> <asp:CheckBox runat="server" ClientIDMode="Static" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> </div> </form> </body> </html>

結果

イメージ説明

html

イメージ説明

投稿2020/08/31 03:43

編集2020/09/01 01:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問