Atlas Control Toolkit Demo:从数据库中取得数据并填充CascadingDropDown控件

本文介绍如何在ASP.NET应用中使用CascadingDropDown控件,并从数据库中获取数据来填充联动下拉菜单组。文章详细展示了如何配置CascadingDropDown控件,设置其属性以实现基于用户选择的动态数据加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:本文应菌哥之邀,翻译自:http://atlas.asp.net/atlastoolkit/Walkthrough/CCDWithDB.aspx,不保证内容或示例程序的正确性。

关于Atlas Control Toolkit,请参考:

  1. "Atlas" Control Toolkit更新发布(Version 1.0.60504.0)
  2. Atlas Control ToolKit 发布

CascadingDropDown(中文可译作“联动下拉菜单组”,演示程序请见:http://atlas.asp.net/atlastoolkit/CascadingDropDown/CascadingDropDown.aspx)是这个Control Toolkit中的一个Control。在Toolkit中附带的Demo中,CascadingDropDown使用了一个XML作为数据源。这样,一个常见的问题就是如何使用数据库来代替XML。本文因此而生,将介绍如何从数据库中取得数据并填充到CascadingDropDown中。

首先建立一个Atlas网站(或应用程序),并在项目中添加对AtlasControlToolkit.dll的引用。

新建一个Atlas页面,添加如下三个DropDownList到页面中:

None.gif < div >
None.gif  Make: 
< asp:DropDownList  ID ="ddlMake"
None.gif    runat
="server" />< br />
None.gif  Model: 
< asp:DropDownList  ID ="ddlModel"
None.gif    runat
="server" />< br />
None.gif  Color: 
< asp:DropDownList  ID ="ddlColor"
None.gif    runat
="server" />           
None.gif  
< br  />           
None.gif  
< asp:Button  ID ="Button1"
None.gif    runat
="server"  Text ="Submit"   />
None.gif
</ div >

在ASPX页面的开头部分注册Atlas Control Toolkit:

None.gif   < %@ Register
None.gif    
Assembly ="AtlasControlToolkit"
None.gif    Namespace
="AtlasControlToolkit"
None.gif    TagPrefix
="atlasToolkit"  % >

在页面上添加这个CascadingDropDown extender。

None.gif   < atlasToolkit:CascadingDropDown
None.gif  
ID ="CascadingDropDown1"
None.gif  runat
="server" />

在运行时,这个extender会异步的调用指定的Web Service,在这个Web Service中,我们需要添加如下一个Web Method。(注意:您不能改变下述Web Method签名中的参数名。)

None.gif [WebMethod]
None.gif
public  CascadingDropDownNameValue[] GetColorsForModel(
None.gif    
string  knownCategoryValues,
None.gif    
string  category
None.gif)

CascadingDropDown extender将把当前被选中的DropDownList中的key和value通过knownCategoryValues参数传给这个Web Method。例如,若当前该extender需要取得Color中应该填充的值,则knownCategoryValues参数将包含目前选中的Make和Model的值。

CascadingDropDown类有一个Helper方法,可以帮助您取得knownCategoryValues参数中的值:

None.gif StringDictionary kv  =  CascadingDropDown
None.gif  .ParseKnownCategoryValuesString(knownCategoryValues);

上述方法返回一个StringDictionary对象,包含了当前被选中的若干个DropDownList中的name/value对。设想当前Make和Model的值已经被选好,您需要根据他们访问数据库返回Color的可选值。则示例代码应该如下所示:

None.gif  [WebMethod]
None.gif
public  CascadingDropDownNameValue[] GetColorsForModel(
None.gif  
string  knownCategoryValues,
None.gif  
string  category)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  StringDictionary kv 
=
InBlock.gif    CascadingDropDown.ParseKnownCategoryValuesString(
InBlock.gif    knownCategoryValues);
InBlock.gif 
InBlock.gif  
int modelId;
InBlock.gif  
if (!kv.ContainsKey("Model"||
InBlock.gif      
!Int32.TryParse(kv["Model"], out modelId))
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
return null;
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  CarsTableAdapters.ColorTableAdapter adapter 
=
InBlock.gif    
new CarsTableAdapters.ColorTableAdapter();
InBlock.gif  
InBlock.gif  Cars.ColorDataTable colorTable 
= 
InBlock.gif    adapter.GetColorsForModel(modelId);
InBlock.gif
InBlock.gif  List
<CascadingDropDownNameValue> values =
InBlock.gif    
new List<CascadingDropDownNameValue>();
InBlock.gif 
InBlock.gif  
foreach (DataRow dr in colorTable)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif      values.Add(
new CascadingDropDownNameValue(
InBlock.gif      (
string) dr["Color"], 
InBlock.gif      dr[
"ColorID"].ToString()));
ExpandedSubBlockEnd.gif  }
 
InBlock.gif 
InBlock.gif  
return values.ToArray();
ExpandedBlockEnd.gif}
 

让我们再回来看看CascadingDropDown extender的声明:

None.gif    < atlasToolkit:CascadingDropDown   ID ="CascadingDropDown1"
None.gif  runat
="server" >
None.gif  
< atlasToolkit:CascadingDropDownProperties
None.gif    
TargetControlID ="ddlMake"
None.gif    Category
="Make"
None.gif    PromptText
="Select a manufacturer"
None.gif    ServicePath
="CarsService.asmx"
None.gif    ServiceMethod
="GetCarMakes"   />
None.gif
</ atlasToolkit:CascadingDropDown >

其中TargetControlID用来指定extender将要扩展的DropDownList。PromptText指定该DropDownList中没有被选项时的提示文字。ServicePathServiceMethod指定了获取该DropDownList中数据的Web Service与其中的Web Method。

我们也可以在VS的设计器中更改上述属性:
pbrs.png

注意到ParentControlID属性指定了当前DropDownList的“父”DropDownList。当“父”DropDownList被选择后,CascadingDropDown extender将自动调用服务器的相应方法获取并设定当前DropDownList的值,这样也就产生了“联动”的效果。

在我们的示例程序中,CascadingDropDown extender的声明应该如下所示:

None.gif < atlasToolkit:CascadingDropDown  ID ="CascadingDropDown1"
None.gif  runat
="server" >  
None.gif  
< atlasToolkit:CascadingDropDownProperties
None.gif    
TargetControlID ="ddlMake"  
None.gif    Category
="Make"  
None.gif    PromptText
="Select a manufacturer"  
None.gif    ServicePath
="CarsService.asmx"  
None.gif    ServiceMethod
="GetCarMakes"   />  
None.gif  
< atlasToolkit:CascadingDropDownProperties 
None.gif    
TargetControlID ="ddlModel"  
None.gif    ParentControlID
="ddlMake"  
None.gif    PromptText
="Please select a model"  
None.gif    ServiceMethod
="GetModelsForMake"  
None.gif      ServicePath
="CarsService.asmx"  
None.gif    Category
="Model"   />  
None.gif  
< atlasToolkit:CascadingDropDownProperties 
None.gif    
TargetControlID ="ddlColor"  
None.gif    ParentControlID
="ddlModel"  
None.gif    PromptText
="Please select a color"  
None.gif    ServiceMethod
="GetColorsForModel"  
None.gif    ServicePath
="CarsService.asmx"  
None.gif    Category
="Color" />  
None.gif
</ atlasToolkit:CascadingDropDown >

完成后的Web Service如下所示:

ContractedBlock.gif ExpandedBlockStart.gif Full Web Service Code
None.gifusing System;
None.gif
using System.Web;
None.gif
using System.Collections;
None.gif
using System.Collections.Generic;
None.gif
using System.Collections.Specialized;
None.gif
using System.Web.Services;
None.gif
using System.Web.Services.Protocols;
None.gif
using AtlasControlToolkit;
None.gif
using System.Data;
None.gif
using System.Data.SqlClient;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//// <summary>
InBlock.gif
/// Summary description for CarData
ExpandedBlockEnd.gif
/// </summary>

None.gif[WebService(Namespace = "http://tempuri.org/")]
None.gif[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
None.gif
public class CarData : System.Web.Services.WebService
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif  
public CarData()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
//Uncomment the following line if using designed components 
InBlock.gif    
//InitializeComponent(); 
ExpandedSubBlockEnd.gif
  }

InBlock.gif
InBlock.gif  [WebMethod]
InBlock.gif  
public CascadingDropDownNameValue[] GetMakes(
InBlock.gif    
string knownCategoryValues,
InBlock.gif    
string category)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    CarsTableAdapters.MakeTableAdapter makeAdapter 
=
InBlock.gif      
new CarsTableAdapters.MakeTableAdapter();
InBlock.gif    Cars.MakeDataTable makes 
= makeAdapter.GetMakes();
InBlock.gif    List
<CascadingDropDownNameValue> values =
InBlock.gif      
new List<CascadingDropDownNameValue>();
InBlock.gif    
foreach (DataRow dr in makes)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
string make = (string)dr["Make"];
InBlock.gif      
int makeId = (int)dr["MakeID"];
InBlock.gif      values.Add(
new CascadingDropDownNameValue(
InBlock.gif        make, makeId.ToString()));
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return values.ToArray();
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  [WebMethod]
InBlock.gif  
public CascadingDropDownNameValue[] GetModelsForMake(
InBlock.gif    
string knownCategoryValues,
InBlock.gif    
string category)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    StringDictionary kv 
=
InBlock.gif      CascadingDropDown.ParseKnownCategoryValuesString(
InBlock.gif      knownCategoryValues);
InBlock.gif    
int makeId;
InBlock.gif    
if (!kv.ContainsKey("Make"||
InBlock.gif        
!Int32.TryParse(kv["Make"], out makeId))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
return null;
ExpandedSubBlockEnd.gif    }

InBlock.gif    CarsTableAdapters.ModelTableAdapter makeAdapter 
=
InBlock.gif      
new CarsTableAdapters.ModelTableAdapter();
InBlock.gif    Cars.ModelDataTable models 
=
InBlock.gif      makeAdapter.GetModelsForMake(makeId);
InBlock.gif    List
<CascadingDropDownNameValue> values =
InBlock.gif      
new List<CascadingDropDownNameValue>();
InBlock.gif    
foreach (DataRow dr in models)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      values.Add(
new CascadingDropDownNameValue(
InBlock.gif        (
string)dr["Model"], dr["ModelID"].ToString()));
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return values.ToArray();
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  [WebMethod]
InBlock.gif  
public CascadingDropDownNameValue[] GetColorsForModel(
InBlock.gif    
string knownCategoryValues,
InBlock.gif    
string category)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    StringDictionary kv 
=
InBlock.gif      CascadingDropDown.ParseKnownCategoryValuesString(
InBlock.gif      knownCategoryValues);
InBlock.gif    
int modelId;
InBlock.gif    
if (!kv.ContainsKey("Model"||
InBlock.gif        
!Int32.TryParse(kv["Model"], out modelId))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
return null;
ExpandedSubBlockEnd.gif    }

InBlock.gif    CarsTableAdapters.ColorTableAdapter adapter 
=
InBlock.gif      
new CarsTableAdapters.ColorTableAdapter();
InBlock.gif    Cars.ColorDataTable colorTable 
=
InBlock.gif      adapter.GetColorsForModel(modelId);
InBlock.gif    List
<CascadingDropDownNameValue> values =
InBlock.gif      
new List<CascadingDropDownNameValue>();
InBlock.gif    
foreach (DataRow dr in colorTable)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      values.Add(
new CascadingDropDownNameValue(
InBlock.gif        (
string)dr["Color"], dr["ColorID"].ToString()));
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return values.ToArray();
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

最后要注意的是在运行时,页面的EventValidation应该被禁用。因为EventValidation用来确保页面上控件的实际值与页面从服务器发送过来时的值相同,而这里显然是不可能的。

转载于:https://www.cnblogs.com/dflying/archive/2006/05/08/Atlas_Control_Toolkit_Demo__Using_CascadingDropDown_with_a_Database.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值