0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Repeaterコントロールからキャストする方法について

Last updated at Posted at 2016-10-26

少し問題が解決したので自分メモ用。初投稿になります!

やりたいこと

Repeaterコントロールを使用して繰り返し表示をしたい

前提条件

  1. ASP.NET + WebForm
  2. RepeaterコントロールにはArrayListを指定
  3. ArrayListにはモデルクラス(Hoge)を格納
  4. モデルクラス等は別プロジェクト(hogehoge)で構成されており、本体のプロジェクトはそちらを参照する
Hoge.cs
namespace hogehoge.models

public sealed class Hoge()
{
    public string No
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }
}

やったこと

  • aspxファイル内で名前空間を指定する
Hoge.aspx
<%@ Import Namespace="hogehoge.models" %>
  • Hogeクラスにキャストする
Hoge.aspx
<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <tbody>
            <tr>
                <td><%# ((Hoge)(Container.DataItem)).No %></td>
                <td><%# ((Hoge)(Container.DataItem)).Name %></td>
            </tr>
        </tbody>
    </ItemTemplate>
</asp:Repeater>

このままだと参照指定不足で警告が出るので、Web.Configに名前空間を指定する。

Web.Config
<system.web>
    <pages>
        <namespaces>
            <add namespace="hogehoge.models"/>
        </namespaces>
    </pages>
</system.web>

はまった点

Google先生に教えを乞いたが、キーワードが悪いのかヒットせず苦労した。
Web.Configで指定する方法を知らなかったので、参照不足問題に悩まされた。
モデルクラスを本体側のApp_Codeフォルダに入れて試したが、CS0433エラー、ビルドアクション、コンパイルエラーに悩まされた。

昔はGridViewを使用していたので特別困ることはなかったが、今回はモックから作成したのでこのままHTML構成を変更せずに進めようとRepeaterコントロールを使用したのでした。

おまけ

  • Dictionaryの使用方法
Hoge.aspx
<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <tbody>
            <tr>
                <td><%# ((Hoge)DataBinder.Eval(Container.DataItem, "value")).No %></td>
                <td><%# ((Hoge)DataBinder.Eval(Container.DataItem, "value")).Name %></td>
            </tr>
        </tbody>
    </ItemTemplate>
</asp:Repeater>

課題

毎回Container.DataItemを指定せず、Hogeクラスにキャストできる気がするが、<% と <%# をうまく区別できない・・。

  • イメージ
Hoge.aspx
<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <%= Hoge hoge = (Hoge)Container.DataItem %>
        <tbody>
            <tr>
                <td><%# hoge.No %></td>
                <td><%# hoge.Name %></td>
            </tr>
        </tbody>
    </ItemTemplate>
</asp:Repeater>

追記

テンプレート(と呼んでよいのか)側にコードの記述が増えるので(既に増えている・・)好ましくはないが、aspxファイルのソース側のcsファイルにprotected宣言した変数は参照できる様子・・。まじか。。

HogePage.cs
public partial class HogePage: Page
{
    protected ArrayList hoges;
    ・・・
    Hoge hoge = new Hoge();
    hoge.No = "100";
    hoge.Name = "ほげ";
    hoges.Add(hoge);
}
HogePage.aspx
<% foreach (Hoge hoge in hoges) { %>
   <tbody>
       <tr>
           <td><%# hoge.No %></td>
           <td><%# hoge.Name %></td>
       </tr>
   </tbody>
<% } %}

ん~、WebFormに限って言えば、コントロール使うよりこっちの方がすっきりする気がする。どうするかな・・。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?