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