.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」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|