天天看點

下拉框控件dhtmlXCombo在ASP.NET中的使用詳解

   在ASP.NET項目中經常會用到下拉框控件,但是ASP.NET提供的DropDownList控件不能修改樣式,經常會與網站整體風格格格不入。這裡要介紹的dhtmlXCombo控件是一款基于JQuery的下拉框控件,可以自定義樣式。

    我在使用這款控件之前在網上搜尋有關該控件在ASP.NET中的使用方法,但是相關的文章幾乎沒有,而該控件也隻提供了php項目中的使用說明,也提供了從.xml檔案中動态讀取資料的例子,但是并沒有從關系資料庫中動态讀取資料的例子。于是我自己研究了一番,果然成功了!為友善起見,下面我将示範該控件從Access資料庫中動态讀取資料的例子。

    首先你需要到官網上下載下傳這個控件包,網址:http://www.dhtmlx.com/x/download/regular/110318/dhtmlxSuite.zip

官網: http://www.dhtmlx.com

壓縮包 dhtmlxSuite.zip 中包含了這個控件。

    下面我們建立一個網站項目來進行測試,項目的檔案清單如下圖:

下拉框控件dhtmlXCombo在ASP.NET中的使用詳解

    你需要将dhtmlXCombo控件包複制到項目中。後面我将一個個介紹每個檔案的作用以及代碼清單。

    在開始之前請先檢視“引用”檔案夾中是否包含System.Web.Extensions項,如果沒有就右擊項目根目錄選擇“添加引用”,在.NET頁中可以看到System.Web.Extensions庫。(如果這個庫不可見,但架構已安裝,可以選擇Browse(浏覽)頁手動添加Syystem.Web.Extensions.dll檔案。如果沒有看到這個庫,可以檢查你的安裝,确認确實已經正确安裝了架構。)

下拉框控件dhtmlXCombo在ASP.NET中的使用詳解

   在這個對話框中,選擇System.Web.Extensions來增加ASP.NET AJAX庫的一個引用。因為在這個測試中我們要用到ASP.NET AJAX。

一.  配置Web.Config.

    這個例子中使用的是Access資料庫,在web.config檔案中把 < connectionStrings / > 替換為

< connectionStrings >

  < add   name = " testdbConnectionString "   connectionString = " Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/ 測試 /dhtmlXComboTest/testdb.mdb;Persist Security Info=True;Jet OLEDB:Database Password=admin "

    providerName = " System.Data.OleDb "  />

</ connectionStrings >

(Data Source中的檔案路徑根據你存放testdb.mdb路徑進行修改)。

這裡的testdb.mdb檔案存放了兩張表,一張T_Province表,一張T_City表,分别用來存放中國省份資訊和城市資訊,為簡單起見這裡隻收錄了三個省的資訊。

下拉框控件dhtmlXCombo在ASP.NET中的使用詳解

二.  使用ASP.NET Web服務。

在項目中建立一個WebServive,命名為TestWebService.asmx。檔案的代碼如下:

using  System;

using  System.Collections;

using  System.ComponentModel;

using  System.Data;

using  System.Linq;

using  System.Web;

using  System.Web.Services;

using  System.Web.Services.Protocols;

using  System.Xml.Linq;

using  System.Data.OleDb;

using  System.Collections.Generic;

namespace  dhtmlXComboTest

{

     ///   <summary>

     ///  TestWebService  的摘要說明

     ///   </summary>

    [ WebService (Namespace =  "http://tempuri.org/" )]

    [ WebServiceBinding (ConformsTo =  WsiProfiles .BasicProfile1_1)]

    [ ToolboxItem ( false )]

     //  若要允許使用  ASP.NET AJAX  從腳本中調用此  Web  服務,請取消對下行的注釋。

    [System.Web.Script.Services. ScriptService ]   // !!!!!!!!!!!允許使用 ASP.NET AJAX  從腳本調用此 Web 服務。

     public   class   TestWebService  : System.Web.Services. WebService

    {

         private   string  ConnectionString

        {

             get

            {

                 return  System.Configuration. ConfigurationManager .ConnectionStrings[ "testdbConnectionString"].ToString();

            }

        }

         private   OleDbConnection  myConnection

                 return   new   OleDbConnection ( this .ConnectionString);

        [ WebMethod ]

         private   void  OpenDataSource()

             if  ( this .myConnection !=  null )

                 if  ( this .myConnection.State ==  ConnectionState .Closed)

                {

                     try

                    {

                        myConnection.Open();

                    }

                     catch  ( Exception  ex)

                         throw   new   Exception (ex.ToString(), ex);

                }

         private   void  CloseDataSource()

                 if  ( this .myConnection.State ==  ConnectionState .Open)

                        myConnection.Close();

         private   DataSet  ExctueForDataSet( string  sqlStr)

             this .OpenDataSource();

             OleDbDataAdapter  myDataAdapter =  new   OleDbDataAdapter (sqlStr, myConnection);

             DataSet  dataSet =  new   DataSet ();

            myDataAdapter.Fill(dataSet);

             this .CloseDataSource();

             return  dataSet;

         ///   <summary>

         ///   擷取省份資訊

         ///   </summary>

         ///   <returns></returns>

         public   List < ProvinceInfo > GetProvinceList()

             // 查詢省份資訊

             string  sql =  "Select ProvinceID,ProvinceName From T_Province Order By ProvinceID asc" ;

             // 填充到 DataSet 中

             DataSet  ds =  this .ExctueForDataSet(sql);

             // 建立 ProvinceInfo 的範型

             List < ProvinceInfo > provinceList =  new   List < ProvinceInfo >();

             for  ( int  i = 0; i < ds.Tables[0].Rows.Count; i++)

                 int  provinceId =  Convert .ToInt32(ds.Tables[0].Rows[i][ "ProvinceID" ].ToString());

                 string  provinceName = ds.Tables[0].Rows[i][ "ProvinceName" ].ToString();

                provinceList.Add( new   ProvinceInfo (provinceId, provinceName));

             // 傳回結果

             return  provinceList;

         ///   擷取指定省份下的城市資訊

         ///   <param name="nProvinceID"></param>

         public   List < CityInfo > GetCityList( int  nProvinceID)

             string  sql =  "Select CityID,CityName,ProvinceID From T_City Where ProvinceID="  + nProvinceID + " Order By CityID asc" ;

             // 建立 CityInfo 的範型

             List < CityInfo > cityList =  new   List < CityInfo >();

             if  (ds.Tables[0].Rows.Count > 0)

                 for  ( int  i = 0; i < ds.Tables[0].Rows.Count; i++)

                     int  cityId =  Convert .ToInt32(ds.Tables[0].Rows[i][ "CityID" ].ToString());

                     string  cityName = ds.Tables[0].Rows[i][ "CityName" ].ToString();

                     int  provinceId =  Convert .ToInt32(ds.Tables[0].Rows[i][ "ProvinceID" ].ToString());

                    cityList.Add( new   CityInfo (cityId, cityName, provinceId));

             return  cityList;

    }

}

這個服務用來從資料庫中讀取省份資訊,并讀取指定省份下的城市資訊。其中 GetProvinceList() , GetCityList( int nProvinceID) 方法的傳回類型為範型,範型清單中的資料類型分别 為ProvinceInfo和CityInfo, 這是兩個自定義類, 定義在 TestClass.cs 檔案中 。 代碼如下 :

using  System.Configuration;

using  System.Web.Security;

using  System.Web.UI;

using  System.Web.UI.HtmlControls;

using  System.Web.UI.WebControls;

using  System.Web.UI.WebControls.WebParts;

     public   class   ProvinceInfo

         public  ProvinceInfo()

         public  ProvinceInfo( int  nProvinceID,  string  sProvinceName)

             this .m_ProvinceID = nProvinceID;

             this .m_ProvinceName = sProvinceName;

         private   int  m_ProvinceID;

         public   int  ProvinceID

                 return   this .m_ProvinceID;

         private   string  m_ProvinceName;

         public   string  ProvinceName

                 return   this .m_ProvinceName;

     public   class   CityInfo

         public  CityInfo()

         public  CityInfo( int  nCityID,  string  sCityName,  int  nProvinceID)

             this .m_CityID = nCityID;

             this .m_CityName = sCityName;

         private   int  m_CityID;

         public   int  CityID

                 return   this .m_CityID;

         private   string  m_CityName;

         public   string  CityName

                 return   this .m_CityName;

到此為止,背景已準備完畢,下面來看看如何從頁面調用這些代碼來把資料動态的寫到

dhtmlXCombo控件中。

三.  前台調用Web服務。

建立一個dhtmlXComboTest.aspx頁面,頁面代碼如下:

<% @   Page   Language ="C#"   AutoEventWireup ="true"   CodeBehind ="dhtmlXComboTest.aspx.cs"

     Inherits ="dhtmlXComboTest.dhtmlXComboTest"   %>

<! DOCTYPE   html   PUBLIC   "-//W3C//DTD XHTML 1.0 Transitional//EN"   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

< html   xmlns ="http://www.w3.org/1999/xhtml">

< head   runat ="server">

     < title > dhtmlXCombo 測試頁 </ title >

     < script   type ="text/javascript">

window.dhx_globalImgPath= "../Js/dhtmlxCombo/codebase/imgs/" ;

     </ script >

     < link   rel ="STYLESHEET"   type ="text/css"   href ="../Js/dhtmlxCombo/codebase/dhtmlxcombo.css"   />

     < script   type ="text/javascript"   src ="../Js/dhtmlxCombo/codebase/dhtmlxcommon.js"></ script >

     < script   type ="text/javascript"   src ="../Js/dhtmlxCombo/codebase/dhtmlxcombo.js"></ script >

     < script   src ="../Js/dhtmlxCombo/codebase/ext/dhtmlxcombo_whp.js"   type ="text/javascript"></ script >

</ head >

< body >

     < form   id ="form1"   runat ="server">

     < asp : ScriptManager   ID ="ScriptManager1"   runat ="server">

         < Services >

             < asp : ServiceReference   Path ="~/TestWebService.asmx"   />

         </ Services >

     </ asp : ScriptManager >

     < div >

         < div   id ="combo_province"   style =" width :  115px ;  height :  30px">

         </ div >

         < script   type ="text/javascript">

             var  combo1= new  dhtmlXCombo( "combo_province" , "combo_province" ,115);

            combo1.addOption( "0" , " 選擇省份 " );

            combo1.setComboValue( "0" );

         </ script >

     </ div >

         < div   id ="combo_city"   style =" width :  115px ;  height :  30px">

             var  combo2= new  dhtmlXCombo( "combo_city" , "cobo_city" ,115);

            combo2.addOption( "0" , " 選擇城市 " );

            combo2.setComboValue( "0" );

            combo2.attachEvent( "onSelectionChange" ,onCitySelectionChange); // 添加下拉框的 onchange 事件

            dhtmlXComboTest.TestWebService.GetProvinceList(onGetProvinceListSuccess,onFailure); // 調用 Web 服務中的GetProvinceList 方法

            combo1.attachEvent( "onSelectionChange" ,onProvinceSelectionChange); // 添加下拉框的 onchange 事件

             function  onGetProvinceListSuccess(result,context,methodName)

                 for ( var  i=0;i<result.length;i++)

                    combo1.addOption(result[i].ProvinceID.toString(),result[i].ProvinceName);

             function  onProvinceSelectionChange()

                dhtmlXComboTest.TestWebService.GetCityList(combo1.getSelectedValue(),onGetCityListSuccess,onFailure);

                 return   true ;

             function  onGetCityListSuccess(result,context,methodName)

                 if (result.length>0)

                    combo2.clearAll(); // 清空舊的清單

                     for ( var  i=0;i<result.length;i++)

                        combo2.addOption(result[i].CityID.toString(),result[i].CityName);

                    combo2.setComboValue(result[0].CityID.toString()); // 設定下拉框的值為資料第一行的值

                 else

                    combo2.clearAll();

                    combo2.addOption( "0" , " 選擇城市 " );

                    combo2.setComboValue( "0" );

             function  onCitySelectionChange()

                $get( "msg" ).innerHTML= " 您選擇了:  " + combo1.getSelectedText()+ "-" +combo2.getSelectedText();

             // 錯誤處理

             function  onFailure(error,context,methodName)

                 var  errorMessage=error.get_message();

                alert(errorMessage);

     < div   id ="msg">

     </ form >

</ body >

</ html >

OK,一切就緒,現在你已經可以測試你的成果了!

源碼下載下傳:http://download.csdn.net/source/3326008 ,請用VS2008以上版本打開。