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ならオラクル
> グループ会社
株式会社アエリア
(株)サンゼロミニッツ
株式会社エアネット
> お問い合わせ
> 広告掲載について
> リンクについて
> 著作権について
> その他お問い合わせ
> 利用規約
> 個人情報保護方針
> 会社概要地図
デベロッパー 2005年12月27日 09:30
デベロッパー・バックナンバー
親子データを表示するタブ付きインターフェイスの作成

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

はじめに

 前回の記事『Creating Collapsible Detail Regions in a Repeater』では、いくつかのクライアント側JavaScriptとHTML、それにRepeaterコントロールを使って、大量の情報を管理する方法を紹介しました(Repeaterを使った折りたたみ可能な領域のライブデモをご覧ください)。先週の記事を書いた後、このコンセプトを発展させて「もっと美しい」ユーザインターフェイスを提供するにはどうすればよいかを考えました。私が絵画や芸術的なものに心を傾ける人間でないことは率先して認めますが、美しいインターフェイスに仕上げようとする取り組みは、共有する価値があると思います(今回のライブデモをご覧ください)。

 今回は、親子関係のあるデータを表示するための「タブ付きインターフェイス」の実現方法を紹介したいと思います(前回のRepeaterによる折りたたみ可能な領域のサンプルと同じように、特定のアイテムについて詳細情報を表示するものです)。このインターフェイスは、左側に縦に並んだ一連のタブにリストされる親アイテムと、その右側に子データとして表示される各アイテムの詳細情報を持ちます。クリックによって親アイテムのタブを「選択」すると、その詳細情報が右側のペインに表示されます。

 このインターフェイスの最終目標は、Visual Studio .NETのツールボックスからWebコントロールをドロップするだけでタブ付きインターフェイスを作り出せる、カスタムのASP.NETサーバコントロールを開発することです。しかし、このプロジェクトの完了までには時間がかかりそうなので、まずは現時点で実現できているRepeaterとクライアント側のスクリプトおよびマークアップを紹介しておきたいと思います。そう考えた理由は2つあります。1つは、このインターフェイスの外観をサイトに組み込んでもらうことで皆さんのお役に立てれば、と思ったことです。もう1つは、このクライアント側のスクリプトとマークアップはかなり活用できそうだからです。Internet Explorerでは、見た目にも素晴らしいものになります。しかし、FireFoxでは、機能はするものの、満足のいく見栄えとはとても言えません(まだ、IEとFireFox以外のブラウザではテストしていません)。私よりもCSSとDHTMLの経験のある方から、この状況の改善に役立つアドバイスをいただけるのではないかと期待しています。

タブを配置する

 話を続ける前に、インターフェイスの外観を知ってもらうためにぜひライブデモをご覧になってください。

 タブ付きインターフェイスを生成するためのクライアント側マークアップを作成するにあたり、生成するHTML内では、親と子の情報がひと続きになるようにしたいと考えました。というのは、Repeaterコントロールを使って、親と子のデータを一緒に取り込むことを想定していたからです。先週の記事で紹介した、折りたたみ可能な領域のRepeaterにおける、簡略化した情報と詳細な情報へのアクセス方法と同様の考え方です。要するに、次のような宣言の構文を備えたRepeaterを想定していたわけです。

<asp:Repeater runat="server" ...>
  <ItemTemplate>
    ... render parent (or abbreviated) information ...
    
    ... render child (or detailed) information ...
  </ItemTemplate>
</asp:Repeater>

 こうしたRepeaterを使うと、ページにレンダリングされるHTMLは次のようになります。

... markup for parent (or abbreviated) information for item 1...
... markup for child (or detailed) information for item 1...

... markup for parent (or abbreviated) information for item 2...
... markup for child (or detailed) information for item 2...

    ...

... markup for parent (or abbreviated) information for item N...
... markup for child (or detailed) information for item N...

 このマークアップを使って、ページの各要素をどのようにして求められる形に配置するかが課題でした。これに対しては、一連の親(または簡略化した)タイトルが与えられた場合、子(または詳細化した)情報用マークアップのCSSプロパティdisplaynoneに設定することによって、詳細情報をうまく非表示にすることができました。これこそ私が求めていたものです。また、子(または詳細)情報を表示するときに、その領域の左上隅が、一番上の親タブの右上隅にぴったり重なるようにフラッシュさせることも課題でした。この課題の解決に効果がありそうだと私が考えた唯一のアプローチは、絶対位置の利用でした。

 このマークアップはすべて、<div>タグで囲まれます。タブと子(または詳細)データを配置するために、クライアント側のJavaScript関数setInitialPositions()を作成しました。この関数はページを完全に読み込んだ後に呼び出され、次の計算式を使ってタブと子(または詳細)ペインの絶対位置を設定します。

  • 詳細情報の上座標 = その情報を含む<div>の計算された上座標
  • 詳細情報の左座標 = その情報を含む<div>の計算された左座標 + タブの幅 + 1

 各情報を含む<div>において高さが明示的に設定されない場合、setInitialPositions()関数は、詳細情報のアイテムのうち最大の高さを求めて、その<div>の高さに割り当てます(これにより、すべての子または詳細アイテムは、各自がどれだけの情報を持っているかに関係なく、最も大きな子または詳細アイテムの高さに揃えられます)。詳細情報を含む<div>の上座標と左座標を求めるには、2つの再帰関数getAscendingTops(element)getAscendingLefts(element)を使います。これらの関数は、渡された要素に含まれるHTML要素の集合を調べ、それぞれ上オフセットと左オフセットを足し合わせていくものです。この手法の詳細については、『Determining the Location of a Nonpositioned Element』を参照してください。私が提供しているフリーのオープンソース部品、ASP.NETメニューコントロールskmMenuでは、この手法を利用しています。

親タブのクリック時に子データの表示と非表示を切り替える

 親のタブがクリックされたときに、対応する子のデータを表示する必要があります。この動作は、クライアント側のonclickイベントハンドラを、JavaScript関数showTopic(child/details index)の呼び出しを行うそれぞれのタブに追加することで実現します。child/details indexは、子または詳細データに与えられたインデックスを表します。このインデックスには、1番目の親タブに対応する子(または詳細)データには0、2番目の親タブに対応するものには1、というように値が割り当てられます。showTopic()関数が行う処理は、次のとおりです。

  1. displayプロパティをnoneに設定することによって、現在選択されている子(または詳細)情報を非表示にする
  2. 現在選択されているタブをリセットして「選択されていない」状態にする
  3. displayプロパティをinlineに設定することによって、クリックされたタブに対応する子(または詳細)情報を表示する
  4. 背景色と右側の境界線の色を変えることにより、クリックされたタブを「選択されている」状態にする

データベースのデータをタブ付きインターフェイスに表示する

 データベース内の、親と子、または簡略化と詳細化の関係にある情報をタブ付きインターフェイスに表示するには、次の処理を行う必要があります。

  1. 必要なクライアント側JavaScript関数を用いてASP.NETページを作成する
  2. テンプレート内に適切にマークアップされたコンテンツを持つRepeaterを追加する
  3. 適切なデータベースのデータをRepeaterにバインドするサーバ側コードを追加する

 では、このRepeaterで必要になるマークアップを見てみましょう。基本的に、このRepeaterでは、1アイテムにつき2つの<div>要素が必要になります。1つは親情報または簡略化された情報を含むもの、もう1つはこうした特定の親(または簡略化)情報に対応する子(または詳細)情報を含むものです。先ほど説明したように、タブ付きインターフェイスのマークアップ全体は、<div>タグの内部に置かれます。このマークアップは、Repeaterを宣言する構文の近くで定義するか、RepeaterHeaderTemplateFooterTemplateの内部に挿入することができます。この場合、Repeaterのテンプレートとマークアップは、次のようになります。

<asp:Repeater runat="server" id="rptTabInterface">
  <HeaderTemplate>
    <div id="container" style="width:100%;height:350px">
  </HeaderTemplate>
  
  <ItemTemplate>
    <div id=’h<%# DataBinder.Eval(Container, "ItemIndex")%>’ 
         onclick=’showTopic(<%# DataBinder.Eval(
Container, "ItemIndex")%>);’ 
         style="cursor:pointer;cursor:hand;
                position:relative;z-index:2;
                border-left: solid 1px black;
                width:20%;background-color:#aaaaaa;
                border-right: solid 1px black;
                border-bottom: solid 1px black;padding:5px;">
      ... Parent/abbreviated data goes here ...
    </div>
  
    <div id=’d<%# DataBinder.Eval(Container, "ItemIndex")%>’ 
         style="overflow:auto;z-index:1;
                border: solid 1px black;width:80%;
                position:absolute;background-color:#eeeeee;
                padding:5px;display:none;">
      ... Child/detail data goes here ...
    </div>
  </ItemTemplate>
  
  <FooterTemplate>
    </div>
  </FooterTemplate>
</asp:Repeater>

 上記のサンプルでば、マークアップを含む<div>が、HeaderTemplateFooterTemplateの内側に置かれています。HeaderTemplateにおいてheightが350ピクセルに設定されていることに注意してください。この設定により、子(または詳細)データの表示に必要な領域の大きさに関係なく、タブ付きインターフェイスの高さはきっちり350ピクセルになります。表示領域の高さが350ピクセルを超える子(または詳細)情報には、垂直スクロールバーが付きます。この<div>タグの中でheightの明示的な設定を省略すると、タブ付きインターフェイスの高さは、最大の子(または詳細)データが必要とする値に設定されます。

 ItemTemplateには、2つの<div>要素があります。1つ目は、idhIndexに等しい要素で、親(または簡略化)情報が入っています。このIndexは、現在のRepeaterItemのインデックスを表します。この1つ目の<div>タグの中に置かれるコンテンツは、対応するタブに表示されます。ItemTemplate内の2つ目の<div>要素には、子(または詳細)データが入っていて、dIndexに等しいidを持っています(こうしたidは、HTML要素のスタイルの参照と変更をプログラムによって行うためにクライアント側の関数で使用されるため、注意が必要です)。

 ItemTemplate内のどちらの<div>要素にも、背景色、境界の動作、パディング、オーバフロー時の動作などを定義するスタイルが含まれています。background-colorなど、これらの設定のいくつかを調整すれば、このタブ付きインターフェイスを読者ご自身のサイト向けにカスタマイズできます。詳細アイテムの位置を明示的に決定し、クリックされたタブに応じてスタイルを変更するという作業のすべては、JavaScript関数によって処理されます。この動作の確認(およびソースコードのコピー)には、ライブデモを活用してください。

 最後に1つ、重要なことですが、ページの下部でsetInitialPositions()関数の呼び出しを行います。また、showTopic(0)を呼び出すことによって、最初のタブを自動的に表示することもできます。この表示を行うには、Repeaterの後に次のような<script>ブロックを追加します。

<script language="JavaScript">
  setInitialPositions();
  showTopic(0);
</script>

まとめ

 この記事では、親と子、または簡略化と詳細化の関係にある情報を段階的に表示できるタブ付きインターフェイスの実装方法を紹介しました。クライアント側JavaScriptをRepeaterコントロールと組み合わせ、適切な書式で生成されるマークアップにデータをレンダリングすることによって、このインターフェイスを実現しました。プロジェクトとしての最終目標は、ASP.NETのWebページにコントロールをドラッグアンドドロップするだけで、このインターフェイスを作り上げることができる、カスタムのサーバコントロールを作成することです。今回のところは、とりあえず、ライブデモをご覧いただき、そのコードをコピーして(カスタマイズできる場所はいくつかありますが)そのまま貼り付け、読者ご自身のサイトにこのタブ付きインターフェイスを実装してみてください。

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

著者紹介

Scott Mitchell(Scott Mitchell)


関連記事
  • IEで.NET Windowsフォームコントロールをホストする
  • ASP.NETにおけるOracleのデータキャッシング
  • Office Web Componentsを利用してASP.NETでグラフを作成する
  • Webカスタムコントロールの作成
  • ASP.NETを利用した共有リソースへのアクセス方法


  • 関連テーマ
  • ブラウザ
  • オープンソース


  • ★最新トップニュース
    コラム IT を変えつつあるのはどの技術?(Webビジネス 8月29日 13:30)
    IT マネジャーと企業幹部の間で、IT を最も大胆に変えつつある技術トレンドを巡って意見の相違があるのは当然だ。これら両陣営は敵対関係にある場合が多いため、両者が今日の技術トレンドを違った角度から見ているのは予想できる。
    国内 CTC、日本 HP、マイクロソフト、Hyper-V ベースの仮想化ソリューションを今秋提供へ(Webテクノロジー 8月29日 13:30)
    伊藤忠テクノソリューションズ(CTC)、日本ヒューレット・パッカード(日本 HP)、マイクロソフトの3社は、2008年8月27日、日本 HP とマイクロソフトのサーバー製品・仮想化技術などを組み合わせ、ソリューション検証を共同で実施する、と発表した。
    海外 Facebook 誕生のいきさつが映画に(Webマーケティング 8月29日 13:20)
    ハリウッドの著名脚本家 Aaron Sorkin 氏が、Facebook に自分のページを開設した。Sony Pictures から依頼を受け、Facebook 誕生物語の映画脚本を書くためという。
    海外 価格競争の影響が出た第2四半期のサーバー売上(Webビジネス 8月29日 13:10)
    IDC が、2008年第2四半期のサーバー市場調査を発表した。売上を得るためにベンダー各社が大幅に値下げしている状況がうかがえる内容だ。
    国内 レッドハット、コンサルもパッケージした低価格の SOA 導入支援サービスを開始(LinuxToday 8月29日 13:10)
    SOA 導入初期段階に必要なコンサルテーションサービスと、ユーザーの状況に合わせて独自に設計する技術者向けのトレーニングをセットにしたもの。JBoss Enterprise SOA Platform ユーザーを対象にしたもの。
    トピックス
    > オススメのIT系求人情報【毎週月曜日更新】
    footer_301.gif


    リサーチ
    > デイリーリサーチDLサイト
    > OnlineResearchPortal (リサーチデータバンク)
    > モバイルリサーチ with goo
    footer_301.gif
    キーワード
    > iPhone > Youtube
    > Google > モバイルノート
    > 半導体 > ウィルコム
    > テーマ一覧はこちら
    footer_301.gif
    セミナー情報
    > 第2回インターネットコムマーケティングセミナー
    「モバイルマーケティングの世界」〜これだけはやっておきたいモバイルマーケティング施策とは〜
    9月24日(水)13:00〜17:00 ITS 山王健保会館
    ※詳しくはこちら
    footer_301.gif
    デベロッパー
    > DevX
    > CodeGuru
    > developer.com
    footer_301.gif
    j.i.c.ブログ
    ブログ一覧
    ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」 【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
    「選択と集中」選択をして集中しない限りは勝てない/メディカル・コミュニケーションズ株式会社(8月29日)
    データメーション 【データメーション】
    Apple は顧客の忠誠心にあぐらをかいているのか? (8月27日)
    Graphic Design Forum 【Graphic Design Forum】
    次へとつながる輪 (8月27日)
    最新テクノロジーの意外な処方箋 【最新テクノロジーの意外な処方箋】
    あなたが舌なめずりしたくなるようなもの(8月26日)
    エンジニアの独り言 【エンジニアの独り言】
    データをローカルに保存するWebアプリケーション(8月22日)
    デスマーチからの脱却 【デスマーチからの脱却】
    30min. iPhoneアプリリリース(8月18日)
    footer_301.gif
    最新コラム一覧
    IT マネジメント IT マネジメント

    IT を変えつつあるのはどの技術?(8月29日)
    最新ハイテク講座 最新ハイテク講座

    繁栄か滅亡か!巨大なエネルギー「原子力」の未来(8月29日)
    developer.com developer.com

    レガシーWebアプリケーションをWebLogic Portal内のフルページIFrameとして統合する(8月29日)
    百式のネットビジネス研究 百式のネットビジネス研究

    友達にあなた特製のクスリを贈ることができる「Get Your Drug On」(8月29日)
    週刊-サイト別アクセス状況データ 週刊-サイト別アクセス状況データ

    ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(8月28日)
    「IT の耳」 「IT の耳」

    【書評】『1回の会議・打ち合わせで必ず結論を出す技術』――無意味な会議を撲滅する(8月28日)
    ハードウェアから見たデータベース ハードウェアから見たデータベース

    巨大テーブル活用術1(8月28日)
    ウチのサイトを SEO ウチのサイトを SEO

    検索エンジンが見ている世界(8月27日)
    エンジニア転職ノウハウ開発室 エンジニア転職ノウハウ開発室

    目指せecoエンジニア!グリーンITで地球を救え(8月26日)
    アイレップの SEM フロンティア アイレップの SEM フロンティア

    円滑に SEO を導入・実施するための組織体制を構築しよう(3)(8月26日)
    footer_301.gif
    専門チャンネル
    > セキュリティチャネル > テレコムチャネル
    > サーチエンジンウォッチ
    footer_301.gif
    海外のインターネットコム アメリカ韓国ドイツトルコ
    関連企業のサイト:ストックフォト イラスト ネットストリート ホテル予約サイト タウン情報 出張 事業継承 シミュレーション トランクルーム 優待映画チケット 田舎暮らしガイド オリジナルデザインTシャツ ニタコエ
    Copyright 2008 Jupitermedia Corporation All Rights Reserved. http://www.internet.com/
    space.gif space.gif