japan.internet.com The Internet & IT Network


RSSニュース検索
カテゴリ
> トップページ
> Webビジネス
> Eコマース
> Webファイナンス
> Webマーケティング
> パブリック
> Webテクノロジー
> 携帯・ワイヤレス
> Linux Today
> Linux Tutorial
> J.I.C.ブログ
キャリア
> 転職ならen
> 派遣ならen
> アルバイトならen
> IT求人情報
ヘッドライン
> 今日のヘッドライン
> 週間ヘッドライン
Special Link
> フォトコミュニティ
> ストックフォト
> クリップアート
> イラスト
> フェリカ
> Web2.0
> 写真
イベント&セミナー
> イベントカレンダー
> 書評「IT の耳」
> 出張・接待検索
> ニュースガジェット 注目
無料ニュースメール
> 新規登録
> 変更・解除
> オプトインメールの登録・変更・解除
インフォメーション
> パートナーサイト
転職ならエン
就職ならen
求人ならen
履歴書ならen
アルバイトならエン
CRM/SFAならオラクル
> グループ会社
株式会社アエリア
(株)サンゼロミニッツ
株式会社エアネット
> お問い合わせ
> 広告掲載について
> リンクについて
> 著作権について
> その他お問い合わせ
> 利用規約
> 個人情報保護方針
> 会社概要地図
デベロッパー 2006年1月31日 10:00
デベロッパー・バックナンバー
Repeaterで作る折りたたみ可能な詳細領域

著者: Scott Mitchell  オリジナル版を読む プリンター用 記事を転送
2006年1月31日 10:00 付の記事
海外internet.com発の記事
このエントリーを含むはてなブックマーク この記事をクリップ! Buzzurlにブックマーク Yahoo!ブックマークに登録 newsing it!

はじめに

 Webページを実用に耐えないものにする方法はいくつもあります。雑然としたコンテンツ、お粗末なページレイアウト、明暗の差がない色遣いなどさまざまです。ページをすぐにも実用に耐えないものにする簡単な方法の1つは、「データの詰めすぎ」の状態を作り出すことです。データの詰めすぎの問題を抱えるページでは、1つのページに過剰な量の情報が表示されます。たとえば、多数のフィールドから成るデータベースレコードが何十件も表示されるようなページです。

 データの詰めすぎを緩和する方法は、いくつもあります。データをページに分けて参照できるようにする方法や、データベースフィールドの一部のみを表示して、各レコードに「詳細」リンクを設け、リンクをクリックするとそのレコードの全フィールドが表示されるようにする方法などがあります。もう1つの――驚くほど簡単なうえ、私見ではとても本格的に見える――方法は、データを折りたたみ可能な形式で表示することです。具体的には、各データベースレコードの短い見出しだけを表示して、詳細は隠しておきます。詳細を表示するには、この見出しをクリックします。すると、詳細が自動的に表示されるというしくみです。これを実現するのに必要なものは、小さな気の利いたDHTMLと、クライアント側のJavaScriptだけです。どのようなものができるかをこっそり覗いてみたい方は、このライブデモをご覧ください。

 本稿では、Repeaterを使ってデータを折りたたみ可能な形で表示する方法について説明します。本稿を読み終わるころには、データの詰めすぎを起こさない、しゃれたユーザーインターフェイスを作成するために必要な考え方が身についているでしょう。

クライアント側の操作でコンテンツの表示/非表示を切り替える

 何年も前、まだブラウザのバージョンが4.xだったころから、クライアント側の操作に応じてWebページのコンテンツを表示したり非表示にしたりすることは、かなり簡単にできるようになっています。たとえば、ボタンがクリックされたときに<div>タグのコンテンツを動的に非表示にすることや、マウスが別のコンテンツ領域に移動したときに段落の内容(つまり<p>タグ内のコンテンツ)を表示することができます。

 Webページのデータの表示/非表示を切り替えるトリックの「タネ」は、要素のdisplayおよびvisibilityスタイル設定です。次のHTMLコードは、ボタンがクリックされたときに特定のHTML要素のスタイル設定を切り替えて、コンテンツを表示したり非表示にしたりする方法を示しています。コードに続くインタラクティブデモで、このHTMLを試すことができます。

<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
 appropriate button below...
</div>

<input type="button" value = "Hide Content"
   onclick="showHideContent(’someRegion’, false);">
<input type="button" value = "Show Content"
   onclick="showHideContent(’someRegion’, true);">

 このインタラクティブデモを見るとわかるように、わずかなクライアント側スクリプトを使うだけで、HTML要素のdisplayおよびvisiblityスタイル設定を変更し、それによって要素の表示/非表示を動的に切り替えることができます。これはすべてクライアント側で行われ、ポストバックは必要ありません。要素のスタイルを変更するために、document.getElementById(id)メソッドを使って要素をIDで取得していることに注意してください。その後、取得した要素に適切なプロパティを設定しています。DHTMLの詳細に関しては、本稿では説明しません。DHTMLに関する参考資料はWeb上で数多く公開されているので、そちらを参照してください。

折りたたみ可能なインターフェイスで詳細データを表示する

 ちょっとした手間をかければ、この概念をASP.NET Webページに表示されるデータに適用することができます。多数のフィールドから成るレコードを表示するページがあると、そのページはたちまち手に負えなくなってしまいます。たとえば、ASPFAQs.comにあるFAQについての情報を表示するとします。各FAQはtblFAQsテーブルのレコードとして格納されており、レコードにはFAQ、回答、FAQの参照回数、FAQの投稿者、その他の関連情報が含まれています。この情報をRepeaterを使ってASP.NET Webページに表示するとしましょう。そのためには、次のようなRepeater構文を使います。

<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のItemTemplate内でちょっと気の利いたマークアップを使います。

 まず、各レコードに対して2つの<div>を作成します。1つはFAQの質問を表示するため、もう1つは詳細情報(回答、参照数など)を表示するために使います。1つ目の<div>はすべてのレコードで必ず表示され、クリックされると、関連付けられた詳細情報の<div>の表示/非表示を切り替えます。これを行うには、各<div>に一意のid値を与える必要があります。このid値は、表示/非表示を切り替えるクライアント側のJavaScript関数で参照されます。具体的には、各FAQの質問<div>に「hindex」というidを割り当てます。このindexには、RepeaterアイテムのItemIndexが入ります。個々の詳細情報<div>には「dindex」というidを割り当てます。

 次に示すのは、折りたたみ可能なRepeaterのItemTemplateと、見栄えを良くするCSSクラス、および表示を切り替えるクライアント側のJavaScript関数です。

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

 このコードには、いくつかの留意点があります。まず、各ItemTemplateの2つの<div>要素に、RepeaterItemのインデックス値を含むidを割り当てている点に注目してください。このインデックス値は、ItemIndexプロパティから取得されます。さらに、質問<div>のクライアント側onclickイベントでは、ToggleDisplay()というJavaScript関数を呼び出して、クリックされた質問行のインデックスを渡しています。このToggleDisplay()関数は、その行の詳細情報<div>displayおよびvisibilityのスタイル設定を切り替えます。

 折りたたみ可能なRepeaterの実際の動作を確認するために、ぜひライブデモをご覧ください。おそらく、ページがはるかに簡潔になり、情報の詰めすぎが解消されているということに同意していただけるでしょう。

 それでは、ハッピープログラミング!

著者紹介

Scott Mitchell(Scott Mitchell)


関連記事
  • ASP.NETを使ってランダムなパスワードを生成する
  • 効率的なデータキャッシングでASP.NETのパフォーマンスを改善する
  • フェッチ機能付きのコントロールの作成
  • ASP.NETで機密データを暗号化して保存する
  • 親子データを表示するタブ付きインターフェイスの作成


  • 関連テーマ
  • ブラウザ


  • ★最新トップニュース
    国内 検索から1クリックで動画を Blog 形式で見れる「YouTube2.in」画像のある記事(Webビジネス 8月22日 12:50)
    永上裕之氏は2008年8月21日、YouTube の検索から1クリックで動画を見れる、「YouTube2.in 〜 サクサク動画検索しちゃう」を開始した。
    海外 Amazon.com、新たなクラウド型ストレージサービスを開始(Webビジネス 8月22日 12:30)
    Amazon.com は21日、『Amazon Elastic Compute Cloud』(EC2) の一環として、新しいクラウド型ストレージ サービス『Amazon Elastic Block Store』(EBS) を正式に開始した。
    海外 『iPhone』ユーザーが Apple を告訴、通信事業者にも波及か(携帯・ワイヤレス 8月22日 12:20)
    ネットワーク接続性が約束通りの期待を満たしていないとして、『iPhone 3G』ユーザーが Apple を訴えた。同様の訴訟が、移動体通信事業者にも及ぶ可能性もある。
    国内 モバゲータウン、10代の4割以上が利用――ネットエイジア調べ(Webマーケティング 8月22日 12:10)
    ネットエイジア株式会社は、携帯電話ユーザーに対し「ケータイの利用コンテンツ」に関しての実態調査をモバイルリサーチにて実施、2008年8月22日、調査結果を発表した。
    海外 無線送電システムの開発に取り組む Intel(Webテクノロジー 8月22日 12:10)
    Intel が無線送電システムの開発に取り組んでいる。送電可能距離は約60cm ないし90cm だが、この距離はまだ延びる可能性があり、人などの障害物は迂回して送電できるという。
    トピックス
    > オススメのIT系求人情報【毎週月曜日更新】
    footer_301.gif


    リサーチ
    > デイリーリサーチDLサイト
    > OnlineResearchPortal (リサーチデータバンク)
    > モバイルリサーチ with goo
    footer_301.gif
    キーワード
    > iPhone > Youtube
    > Google > モバイルノート
    > 半導体 > ウィルコム
    > テーマ一覧はこちら
    footer_301.gif
    セミナー情報
    > 第1回インターネットコムマーケティングセミナー「新規クライアントを効率的に獲得する Web マーケティング手法とは」(3月26日)多数のご参加ありがとうございました
    footer_301.gif
    デベロッパー
    > DevX
    > CodeGuru
    > developer.com
    footer_301.gif
    j.i.c.ブログ
    ブログ一覧
    ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」 【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
    「ASP・SaaS型サービス提供会社を成功へ導く徹底サポート!」/株式会社ディーネット(8月22日)
    最新テクノロジーの意外な処方箋 【最新テクノロジーの意外な処方箋】
    帰ってきたWeb 2.0 予測市場(8月22日)
    データメーション 【データメーション】
    中古家電買い取りサイトはどこがベストか?(8月21日)
    デスマーチからの脱却 【デスマーチからの脱却】
    30min. iPhoneアプリリリース(8月18日)
    エンジニアの独り言 【エンジニアの独り言】
    技術進歩の落とし穴!?誰のためにシステムを作っていますか?(8月18日)
    Skypeブログ出張版 【Skypeブログ出張版】
    パナソニックWiFiフォン購入でSkype1ヶ国プランプレゼント(8月13日)
    footer_301.gif
    最新コラム一覧
    IT マネジメント IT マネジメント

    「クラウドコンピューティング」がくだらない理由(8月22日)
    CodeGuru CodeGuru

    AndroidでのGoogle APIを使った地図表示(8月22日)
    最新アフィリエイト事例にみる成功の法則 最新アフィリエイト事例にみる成功の法則

    報酬設定と成果地点の最適化について(8月22日)
    最新ハイテク講座 最新ハイテク講座

    太陽光発電だけじゃない!環境にやさしいエコ発電の最新事情(8月22日)
    週刊-サイト別アクセス状況データ 週刊-サイト別アクセス状況データ

    ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(8月21日)
    気になるオープンソースソフトウェア 気になるオープンソースソフトウェア

    オープンソースのアプリケーションサーバー Apache Geronimo その3(8月21日)
    「IT の耳」 「IT の耳」

    【書評】『暗号解読』―ロゼッタストーンから量子暗号まで―(8月21日)
    検索エンジンマーケティング 検索エンジンマーケティング

    EZweb ではキャリア非公式サイトがクリックされる3つの理由(8月21日)
    百式のネットビジネス研究 百式のネットビジネス研究

    あるテーマに沿ったリンクを集めて共有するのに便利そうな「Agglom」(8月21日)
    Eメールマーケティング事情 Eメールマーケティング事情

    メルマガからメールマーケティングへ(8月20日)
    footer_301.gif
    専門チャンネル
    > セキュリティチャネル > テレコムチャネル
    > サーチエンジンウォッチ
    footer_301.gif
    海外のインターネットコム アメリカ韓国ドイツトルコ
    関連企業のサイト:ストックフォト イラスト ネットストリート ホテル予約サイト タウン情報 出張 事業継承 シミュレーション トランクルーム 優待映画チケット 田舎暮らしガイド オリジナルデザインTシャツ ニタコエ
    Copyright 2008 Jupitermedia Corporation All Rights Reserved. http://www.internet.com/
    space.gif space.gif