LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-02

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案をご参考にどうぞ。

2
2
1

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
2
2