SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

ASP.NETアプリケーションにGoogle Suggest風の機能を追加する

Ajaxを利用して入力候補を自動提示するテキストボックス

Webアプリケーションへの追加

 まず、AutoSuggestBoxパッケージをこちらからダウンロードしてください。AutoSuggestBoxを利用するには、次の4つのファイルを自作アプリケーションに追加する必要があります。

ファイル名説明
AutoSuggestBox.dllコントロールそのものが含まれています。
AutoSuggestBox.jsAjaxをサポートするJavaScriptのメソッドです。
AutoSuggestBox.css自動提示メニューの外観です。
GetAutoSuggestBox.aspx提示する項目が含まれたhtmlを返します。

 まずは「AutoSuggestBox.dll」への参照を追加します。次に、Webアプリケーションのルートの下に「asb-includes」というサブディレクトリを作ります。最後に、このサブディレクトリに残り3つのファイルをコピーします。

 詳細な手順についてはこちらを参照してください。

自動提示メニュー項目を読み込むためにデータの種類を指定する

 まず、ユーザーがAutoSuggestBoxに文字入力を始めたときに提示するメニュー項目のデータソースを用意する必要があります。このシステムでは、データソースを必要な数だけいくつでも使用できます。たとえば、「都市」と「空港」のそれぞれに別々のデータソースが使用することができます。

 データソースを追加するには、「GetAutoSuggestData.aspx」ファイルの変更が必要です。このクラスには、デフォルトで「都市」のデータソースが実装されています。LoadMenuItemsには、次のように、さまざまな種類のデータを読み込むためのswitch文が含まれています。

private ArrayList LoadMenuItems(string sDataType, string sKeyword) 
{
  ArrayList aMenuItems;

  switch(sDataType)
  {
    case "City":
      aMenuItems=LoadCities(sKeyword);
      break;
    default:
      throw new Exception("GetAutoSuggestData Type '"
        + sDataType + "' is not supported.");
  }
  return aMenuItems;
}

 LoadCitiesメソッドは、ユーザーが入力した文字に応じて、自動提示する都市名をデータソースから取得します。次に、ASBMenuItemsの配列を生成し、データベースからの取得結果をそこに格納します。

private ArrayList LoadCities(string sKeyword)
{
  ArrayList aOut=new ArrayList();

  string sConnString="Provider=Microsoft.Jet.OLEDB.4.0;" +
    "Data Source=c:\\databases\\AutoSuggestBox_Demo.mdb;" +
    "User Id=admin;Password=;";
  OleDbConnection oCn=new OleDbConnection(sConnString);

  string sSql="SELECT TOP 10 tblCity.Name as CityName, " +
    "tblCity.Code as CityCode, " +
    "tblCountry.Name as CountryName, " +
    "tblState.Name as StateName " + 
    "FROM (tblCity INNER JOIN tblCountry " +
    "ON tblCity.CountryID=tblCountry.ID) " +
    "  LEFT OUTER JOIN tblState ON tblCity.StateID=tblState.ID " + 
    "WHERE (tblCity.Name LIKE '" +
    sKeyword.Replace("'", "''") + "%') " +
    "ORDER BY tblCity.Name";

  OleDbCommand oCmd = new OleDbCommand(sSql, oCn);
  oCn.Open();

  OleDbDataReader oReader = oCmd.ExecuteReader();

  string sCity;
  string sCityCode;
  string sState;
  string sCountry;

  string sLabel;

  ASBMenuItem oMenuItem;

  while (oReader.Read())
  {
    //Build label using City, Country & State
    sCity     =oReader.GetString(0);
    sCityCode =oReader.GetString(1);
    sCountry  =oReader.GetString(2);

    if (oReader.GetValue(3)==System.DBNull.Value)
      sState="";
    else
      sState=oReader.GetString(3);


    sLabel=sCity;

    //Append either state or country
    if (sState != "")
      sLabel+=", " + sState;
    else
      sLabel+=", " + sCountry;

    oMenuItem=new ASBMenuItem();
    oMenuItem.Label=sLabel;
    oMenuItem.Value=sCityCode;

    aOut.Add(oMenuItem);
  } 

  oReader.Close();
  oCn.Close();

  return aOut;
}

 後から別のデータソースを追加することになっても、LoadMenuItems関数のcase文を増やすだけで済みます。

AutoSuggestBoxコントロールをWebフォームに挿入する

  1. Webフォームを新規に作成するか、既存のフォームを開きます。
  2. aspxページの一番上に次の行を追加します。
  3. <%@ Register TagPrefix="Custom" Namespace="ASB"
                 Assembly="AutoSuggestBox" %> 
    
  4. 提示ボックスを表示したい場所に次の形式で行を追加します。
  5. <Custom:AutoSuggestBox id="Control ID" runat="server"
        DataType="サポートするデータの種類"
        CssClass="テキストボックスのスタイル"
        MaxLength="テキストボックスの最大文字数"
        Columns="表示する文字数"
    />
    
    たとえば、次のようになります。
    <Custom:AutoSuggestBox id="asbCity" runat="server"
        DataType="City"
        CssClass="FormCtrlStyle"
        MaxLength="100"
        Columns="30"
    />
    
  6. DataType属性の値が「GetAutoSuggestData.aspx.cs」になっていることを確認します。詳細は前のセクションをご覧ください。
  7. WebアプリケーションをWebサーバーのルート(たとえば、http://localhost/WebApp)で実行しない場合は、次のようにAutoSuggestBoxタグにもう1つ属性を追加します。
  8. <Custom:AutoSuggestBox id="asbCity" runat="server"
        DataType="City"
        CssClass="FormCtrlStyle"
        MaxLength="100"
        Columns="30"
        ResourcesDir="/WebApp/AutoSuggestBox"
    />
    
注意
 ResourcesDirのデフォルト値は「/asb_includes」です。

動作のしくみ

 このコントロールにユーザーが文字の入力を始めると、JavaScriptによってOnKeyUpOnKeyDownOnKeyPressの各イベントが処理されます。また、Ajaxによって、サーバ側との通信が行われ、クリックごとに提示エントリの一覧が取得されます。

 つまり、イベントの流れは次のようになります。

  1. AutoSuggestBoxコントロールにフォーカスが存在する状態で、ユーザーがキーを押します。
  2. JavaScriptによって、ユーザーが[Up]、[Down]、[Enter]、またはその他のキーを押したかどうかが確認されます。
  3. 提示メニューが表示されていて、ユーザーが[Up]または[Down]キーを押した場合は、適切なメニュー項目が選択状態になります。
  4. ユーザーが[Enter]キーを押すと、提示メニューが非表示になり、現在の選択項目が提示ボックスに表示されます。
  5. ユーザーが英数字を入力すると、JavaScriptによってサーバの「GetAutoSuggestData.aspx」ページにXmlHttpRequestが送信されます。
  6. 「GetAutoSuggestData.aspx」ページはテキストボックスの現在値と取得すべきデータの種類を受けとります。通常は、提示する値をデータベースから取得するためのクエリが生成されます。クエリ結果を用いて提示メニュー用のHTMLが作成され、「GetAutoSuggestData.aspx」ページに返されます。
  7. このWebページが更新後の提示メニューを取得し、古いメニューに代わって新しいメニューを表示します。

まとめ

 本稿では、フリーのAutoSuggestBoxコントロールを利用してWebアプリケーションに「Google Suggest」の機能を簡単に追加する方法を紹介しました。ぜひ自分のアプリケーションでも使ってみてください。

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

関連情報

  • AutoSuggestBoxのサイト -- AutoSuggestBoxに関する説明、デモ、ダウンロードファイルがあります。
  • Google Suggest -- このAutoSuggestBox機能の原点となったサイトです。
  • Travelope -- AutoSuggestBoxを実装した旅行検索エンジンです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Niraj Sharma(Niraj Sharma)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/314 2006/04/11 19:11

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー