摘要:CascadingDropDown with PageMethods
今天在工作上有需要一個連動式的dropdownlist..想到之前看到ajaxtoolkit裡有CascadingDropDown這東東..
就拿來研究給它用一下..看看是個多神奇的東西..
網路上教學都是用它跟webservice的結合..我想說..我也只有這一頁會用到..所以我就用PageMethods去完成..
先看.cs
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Collections.Generic; using System.Collections.Specialized; using System.Web.Services; using AjaxControlToolkit; public partial class test_test11 : System.Web.UI.Page { [WebMethod] public static CascadingDropDownNameValue[] GetColorsForModel(string knownCategoryValues, string category) { //這行是它寫好的東東在AjaxControlToolkit.dll裡面 StringDictionary kv = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues); List<CascadingDropDownNameValue> sArray = new List<CascadingDropDownNameValue>(); //category是來判斷要跑哪個function if (category == "c1") { //從資料庫抓第一個選項的資料 //new myDataSetTableAdapters._addressZipC1TableAdapter()._addressZipC1()這是我另外寫的class來抓資料庫的 DataTable myTb = new myDataSetTableAdapters._addressZipC1TableAdapter() ._addressZipC1(); return toArray(sArray, myTb); } if (category == "c2") { //從資料庫抓第二個選項的資料,kv["c1"]是進來的參數,來提供database來篩選資料 DataTable myTb = new myDataSetTableAdapters._addressZipC2WhereC1TableAdapter() ._addressZipC2WhereC1(kv["c1"]); return toArray(sArray, myTb); } if (category == "c3") { //從資料庫抓第三個選項的資料..等等等..跟上面一樣 DataTable myTb = new myDataSetTableAdapters._addressZipC3WhereC2C3TableAdapter() ._addressZipC3WhereC2C3(kv["c1"], kv["c2"]); return toArray(sArray, myTb); } if (category == "c4") { //從資料庫抓第四個選項的資料..等等等..跟上面一樣 DataTable myTb = new myDataSetTableAdapters._addressZipC4WhereC2C3C4TableAdapter() ._addressZipC4WhereC2C3C4(kv["c1"], kv["c2"], kv["c3"]); return toArray(sArray, myTb); } return null; } //這就是ajaxtoolkit自己寫的class private static CascadingDropDownNameValue[] toArray(List<CascadingDropDownNameValue> sArray, DataTable myTb) { foreach (DataRow ro in myTb.Rows) { sArray.Add(new CascadingDropDownNameValue(ro[0].ToString(), ro[0].ToString())); } return sArray.ToArray(); } protected void Page_Load(object sender, EventArgs e) { } }
再看.aspx
<body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True"> </asp:ScriptManager> <div> <h4> <asp:DropDownList ID="DropDownList1" runat="server" Width="140px"> </asp:DropDownList> <ajaxToolkit:CascadingDropDown ID="CascadingDropDown1" runat="server" Category="c1" LoadingText="讀取中.." TargetControlID="DropDownList1" ServiceMethod="GetColorsForModel" PromptText="請選擇.."> </ajaxToolkit:CascadingDropDown> </h4> <h4> <asp:DropDownList ID="DropDownList2" runat="server" Width="140px"> </asp:DropDownList> <ajaxToolkit:CascadingDropDown ID="CascadingDropDown2" runat="server" Category="c2" LoadingText="讀取中.." TargetControlID="DropDownList2" ServiceMethod="GetColorsForModel" ParentControlID="DropDownList1" PromptText="請選擇.."> </ajaxToolkit:CascadingDropDown> </h4> <h4> <asp:DropDownList ID="DropDownList3" runat="server" Width="140px"> </asp:DropDownList> <ajaxToolkit:CascadingDropDown ID="CascadingDropDown3" runat="server" Category="c3" LoadingText="讀取中.." TargetControlID="DropDownList3" ServiceMethod="GetColorsForModel" ParentControlID="DropDownList2" PromptText="請選擇.."> </ajaxToolkit:CascadingDropDown> </h4> <h4> <asp:DropDownList ID="DropDownList4" runat="server" Width="140px"> </asp:DropDownList> <ajaxToolkit:CascadingDropDown ID="CascadingDropDown4" runat="server" Category="c4" LoadingText="讀取中.." TargetControlID="DropDownList4" ServiceMethod="GetColorsForModel" ParentControlID="DropDownList3" PromptText="請選擇.."> </ajaxToolkit:CascadingDropDown> </h4> </div> </form> </body>
頁面很簡單..就一個ScriptManager..和四個DropDownList跟CascadingDropDown.. 重點就是..ScriptManager的
EnablePageMethods要開..不然用半天..都會跟你說error 500.. 會很傷心的..哈..^^||..
結論:
傳統的UpdatePanel去做..其實簡單輕鬆..很容易就做出來了..但是.. 用這CascadingDropDown視覺效果和結合
PageMethods(WebService)效率..是可以一試的.. 留這篇給大家參考ㄅ..^^..
傳統的UpdatePanel去做..其實簡單輕鬆..很容易就做出來了..但是.. 用這CascadingDropDown視覺效果和結合
PageMethods(WebService)效率..是可以一試的.. 留這篇給大家參考ㄅ..^^..