![]() ![]() ![]() ![]() Repeaterで作る折りたたみ可能な詳細領域この記事のURLhttp://japan.internet.com/developer/20060131/25.html
著者:Scott Mitchell
海外internet.com発の記事
はじめにWebページを実用に耐えないものにする方法はいくつもあります。雑然としたコンテンツ、お粗末なページレイアウト、明暗の差がない色遣いなどさまざまです。ページをすぐにも実用に耐えないものにする簡単な方法の1つは、「データの詰めすぎ」の状態を作り出すことです。データの詰めすぎの問題を抱えるページでは、1つのページに過剰な量の情報が表示されます。たとえば、多数のフィールドから成るデータベースレコードが何十件も表示されるようなページです。 データの詰めすぎを緩和する方法は、いくつもあります。データをページに分けて参照できるようにする方法や、データベースフィールドの一部のみを表示して、各レコードに「詳細」リンクを設け、リンクをクリックするとそのレコードの全フィールドが表示されるようにする方法などがあります。もう1つの――驚くほど簡単なうえ、私見ではとても本格的に見える――方法は、データを折りたたみ可能な形式で表示することです。具体的には、各データベースレコードの短い見出しだけを表示して、詳細は隠しておきます。詳細を表示するには、この見出しをクリックします。すると、詳細が自動的に表示されるというしくみです。これを実現するのに必要なものは、小さな気の利いたDHTMLと、クライアント側のJavaScriptだけです。どのようなものができるかをこっそり覗いてみたい方は、このライブデモをご覧ください。 本稿では、Repeaterを使ってデータを折りたたみ可能な形で表示する方法について説明します。本稿を読み終わるころには、データの詰めすぎを起こさない、しゃれたユーザーインターフェイスを作成するために必要な考え方が身についているでしょう。 クライアント側の操作でコンテンツの表示/非表示を切り替える 何年も前、まだブラウザのバージョンが4.xだったころから、クライアント側の操作に応じてWebページのコンテンツを表示したり非表示にしたりすることは、かなり簡単にできるようになっています。たとえば、ボタンがクリックされたときに Webページのデータの表示/非表示を切り替えるトリックの「タネ」は、要素の <script language="JavaScript"> function showHideContent(id, show) { var elem = document.getElementById(id); if (elem) { if (show) { elem.style.display = ’block’; elem.style.visibility = ’visible’; } else { elem.style.display = ’none’; elem.style.visibility = ’hidden’; } } } </script> <div id="someRegion"> This text will be displayed or hidden when clicking the
このインタラクティブデモを見るとわかるように、わずかなクライアント側スクリプトを使うだけで、HTML要素の 折りたたみ可能なインターフェイスで詳細データを表示する ちょっとした手間をかければ、この概念をASP.NET Webページに表示されるデータに適用することができます。多数のフィールドから成るレコードを表示するページがあると、そのページはたちまち手に負えなくなってしまいます。たとえば、ASPFAQs.comにあるFAQについての情報を表示するとします。各FAQは <asp:Repeater id="rptFAQs" runat="server"> <ItemTemplate> <h2><%# DataBinder.Eval(Container.DataItem, "Description") %> </h2><br /> <b>Submitted By:</b> <%# DataBinder.Eval(Container.DataItem, "SubmittedByName") %> <br /> <b>Views:</b> <%# DataBinder.Eval(Container.DataItem, "ViewCount", "{0:d}") %> <br /> <b>FAQ:</b><br /> <%# DataBinder.Eval(Container.DataItem, "Answer") %> </ItemTemplate> </asp:Repeater> ライブデモを見るとわかるように、これでは少し情報の詰めすぎです。その主な原因は、各FAQの回答がかなり長くなる場合があるからです。 ユーザーインターフェイスをもっと扱いやすくするには、すべてのFAQでこの大量のデータを表示するのではなく、個々のFAQをクリックして、目的のFAQの詳細だけを表示できるようにします。ユーザーが質問の見出しをクリックすると、クライアント側のDHTML/JavaScriptによって見出しが展開され、FAQの詳細が表示されます。これを実現するには、Repeaterの まず、各レコードに対して2つの 次に示すのは、折りたたみ可能なRepeaterの <script language="JavaScript"> function ToggleDisplay(id) { var elem = document.getElementById(’d’ + id); if (elem) { if (elem.style.display != ’block’) { elem.style.display = ’block’; elem.style.visibility = ’visible’; } else { elem.style.display = ’none’; elem.style.visibility = ’hidden’; } } } </script> <style> .header { font-size: larger; font-weight: bold; cursor: hand; cursor:pointer; background-color:#cccccc; font-family: Verdana; } .details { display:none; visibility:hidden; background-color:#eeeeee; font-family: Verdana; } </style> <asp:Repeater id="rptFAQs" runat="server"> <ItemTemplate> <div id=’h<%# DataBinder.Eval(Container, "ItemIndex") %>’ class="header" onclick=’ToggleDisplay( <%# DataBinder.Eval(Container, "ItemIndex") %>);’> <%# DataBinder.Eval(Container.DataItem, "Description") %> </div> <div id=’d<%# DataBinder.Eval(Container, "ItemIndex") %>’ class="details"> <b>Submitted By:</b> <%# DataBinder.Eval(Container.DataItem, "SubmittedByName") %> <br /> <b>Views:</b> <%# DataBinder.Eval(Container.DataItem, "ViewCount", "{0:d}") %> <br /> <b>FAQ:</b><br /> <%# DataBinder.Eval(Container.DataItem, "Answer") %> </div> </ItemTemplate> </asp:Repeater> このコードには、いくつかの留意点があります。まず、各 折りたたみ可能なRepeaterの実際の動作を確認するために、ぜひライブデモをご覧ください。おそらく、ページがはるかに簡潔になり、情報の詰めすぎが解消されているということに同意していただけるでしょう。 それでは、ハッピープログラミング! 著者紹介Scott Mitchell(Scott Mitchell)
|