|
.NET TIPS [ASP.NET]DataGridコントロールのハイパーリンク列で複数のパラメータをデータ連結するには?デジタルアドバンテージ2003/10/03 |
![]() |
|
|
|
「TIPS:[ASP.NET]DataGridコントロールでハイパーリンクを表示するには?」では、ハイパーリンク列として表示するリンクのURLに書式を指定するため、DataNavigateUrlFormatString属性を使用した次のような<asp:HyperLinkColumn>要素について解説した。
<asp:HyperLinkColumn
DataTextField="name"
DataNavigateUrlField="id"
DataNavigateUrlFormatString="result.aspx?target={0}"
HeaderText="商品名" />
しかし、この<asp:HyperLinkColumn>要素ではURL中に含めることのできるデータソース要素のフィールドは1つに限られる。そのため、複数のパラメータを持った次のようなURLをデータ連結によって出力することはできない(この場合「123」および「456」の部分がパラメータとなる)。
result.aspx?target=123&category=456
2つ以上の項目をデータ連結させてURL中に含めるにはどうすればよいのだろうか。このような場合には、もはや<asp:HyperLinkColumn>要素は使用できず、HyperLinkコントロール(正確にはHyperLink Webサーバ・コントロール)を利用した独自の列(テンプレート列)をDataGridコントロールで定義しなければならない。
HyperLink Webサーバ・コントロール
HyperLinkコントロールはページ内にハイパーリンクを表示するためのものだ。HTMLの<a>タグを使用した単純なハイパーリンクとは別に、このようなコントロールがWebサーバ・コントロールの1つとして用意されている理由は、そのプロパティをコードから操作可能にするためである。
HyperLinkコントロールの基本的な記述例は次のようになる。
<asp:HyperLink id="MyLink" runat="server"
Text="Insider.NETトップ・ページ"
NavigateUrl="http://www.atmarkit.co.jp/fdotnet/" />
このコントロールをDataGridコントロール内で用い、Text属性やNavigateUrl属性にデータ連結式を記述することにより、複数のパラメータを持つハイパーリンク列が実現できる。
テンプレート列を使用したハイパーリンク列
DataGridコントロールに独自のテンプレート列を作成するには、<Columns>要素内に<asp:TemplateColumn>要素を記述して列を定義する。これについては「TIPS:[ASP.NET]DataGridコントロールで通し番号を付けるには?」で解説しているので、まずそちらを参考にしていただきたい。
テンプレート列とHyperLinkコントロールを使用して、まず冒頭で示した<asp:HyperLinkColumn>要素と同等なものを記述すると次のようになる。
<asp:TemplateColumn HeaderText="商品名">
<ItemTemplate>
<asp:HyperLink runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "name") %>'
NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "id", "result.aspx?target={0}") %>' />
</ItemTemplate>
</asp:TemplateColumn>
ここではデータ連結式内での記述を読みやすくするためにDataBinder.Evalメソッドを使用している。このメソッドの詳細については「TIPS:[ASP.NET]DataBinder.Evalメソッドを使用するメリット/デメリットは?」で解説している。DataBinder.Evalメソッドを使用する場合には、その第2パラメータで文字列を指定する際にダブル・クォート(")を使用するので、NavigateUrl属性などの指定にはシングル・クォート(')を使用しなくてはならない。
なお、データ連結により出力される文字列に空白文字などが含まれている場合、Webブラウザによっては正しく処理できない場合もある。そのような場合にはHttpServerUtilityクラス(System.Web名前空間)のUrlEncodeメソッドを使用して、文字列をHTTPで送信可能な形式にエンコードする必要がある。このメソッドはASP.NETのページに含まれるServerオブジェクトを経由して、Server.UrlEncodeメソッドとして使用可能だ。
複数のパラメータをデータ連結するハイパーリンク列
以上の点をふまえて、本題のURL中に複数のパラメータをデータ連結するハイパーリンク列を記述すると次のようになる。なおここでは、データソースの要素に「category」という名前のフィールドも含まれていると仮定する。
<asp:TemplateColumn HeaderText="商品名">
<ItemTemplate>
<asp:HyperLink runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "name") %>'
NavigateUrl='<%#
"result.aspx?id="
+ DataBinder.Eval(Container.DataItem, "id")
+ "&category="
+ DataBinder.Eval(Container.DataItem, "category") %>' />
</ItemTemplate>
</asp:TemplateColumn>
3つのパラメータをとる書式指定付きのDataBinder.Evalメソッドは、データソース要素の1つのフィールドしか扱えないため、ここではこのメソッドをそれぞれのパラメータごとに使用して、+演算子により文字列として連結している。
もし長いデータ連結式が好ましくないなら、その部分を1つのメソッドとしてまとめてしまえばすっきりと記述できる。
<asp:TemplateColumn HeaderText="商品名">
<ItemTemplate>
<asp:HyperLink runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "name") %>'
NavigateUrl='<%# MakeParameterizedURL(Container) %>'
</ItemTemplate>
</asp:TemplateColumn>
データ連結式内で可能な記述に関しては、「TIPS:[ASP.NET]Container.DataItemの正体は?」を参考にしていただきたい。![]()
| カテゴリ:Webフォーム 処理対象:DataGridコントロール 使用ライブラリ:DataGridコントロール 使用ライブラリ:HyperLinkコントロール 使用ライブラリ:<asp:HyperLinkColumn>要素 使用ライブラリ:<asp:TemplateColumn>要素 使用ライブラリ:HttpServerUtilityクラス(System.Web名前空間) 関連TIPS:[ASP.NET]DataGridコントロールでハイパーリンクを表示するには? 関連TIPS:[ASP.NET]DataGridコントロールで通し番号を付けるには? 関連TIPS:[ASP.NET]DataBinder.Evalメソッドを使用するメリット/デメリットは? 関連TIPS:[ASP.NET]Container.DataItemの正体は? |
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


