Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ASP.NETでリピーターコントロール内で動的に引数を指定してリンク先を作成したい

More than 1 year has passed since last update.

Web FormのASP.NETで
リピーターコントロールを使っている時、かつ、動的に引数を指定してリンク先を作成したい。
(コメントを頂いたので追記しました。)

画面はこんな感じにします。(ヘッダ部はCSSを置きたかっただけで、本筋には関係ありません)

aspx
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style>
        .red    {color:red;}
        .grn    {color:green;} 
    </style>
</head>
aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
                <ItemTemplate>

                    <a name="links" class="red" href='<asp:Literal ID="lits" runat="server" Text=""> 
                    </asp:Literal>' target='_blank'>A案</a>

                    <a class="red" href='<%# "./newpage.aspx?KEY=" + Eval("KEY") %>' target='_blank'>B案</a>

                    <asp:HyperLink ID="hlk" runat="server" Text="" Target="_blank">C案</asp:HyperLink>

                    <br />
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </form>
</body>

ソースコードはこちら

c#
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // テスト用にテーブルを作成
                DataTable dt = new DataTable();
                dt.Columns.Add("KEY");
                dt.Columns.Add("NAME");

                //テーブルに値をセット
                for (int i = 0; i < 3; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["KEY"] = i;
                    dr["NAME"] = "NAME[" + i.ToString() + "]";
                    dt.Rows.Add(dr);
                }

                //リピーターコントロールにテーブルをBindする
                Repeater1.DataSource = dt;
                Repeater1.DataBind();
            }
        }

DataBind時に、ItemDataBoundが動きます。
C案では、cssもソースコードでセットしています。

c#
        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DataRowView view = (DataRowView)e.Item.DataItem;

                //A案
                ((Literal)e.Item.FindControl("lits")).Text = "./newpage.aspx?KEY=" + view["KEY"] + "";

                //C案
                ((HyperLink)e.Item.FindControl("hlk")).NavigateUrl = "./newpage.aspx?KEY=" + view["KEY"];
                ((HyperLink)e.Item.FindControl("hlk")).CssClass = "grn";
            }
        }

実行時に生成されるHTMLは以下の通り(部分)。

aspx
<a name="links" class="red" href='./newpage.aspx?KEY=0' target='_blank'>A案</a>
<a class="red" href='./newpage.aspx?KEY=0' target='_blank'>B案</a>
<a id="Repeater1_hlk_0" class="grn" href="./newpage.aspx?KEY=0" target="_blank">C案</a>

呼ばれた方はこんな感じで受け取ります。参考まで。

c#
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string data = Request.QueryString["KEY"].ToString();
                Label1.Text = data;
            }
        }

いろんな書き方ができますね。
シンプルなのはB案、インライン式が嫌ならC案、何らかの都合でBC案ではうまく制御できない時はA案をご参考にどうぞ。

KazTag
昔ブログに書いた記事をこちらにもって来たり。
https://seagp.com
seagp
企業向けにシステム開発・RPA開発を行っています。
https://seagp.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away