CascadingDropDown从数据库中读取数据绑定到DropDownList控件上?

carllisheng 2007-04-26 09:33:12
CascadingDropDown从数据库中读取数据绑定到DropDownList控件上?WebServices怎么编写?
...全文
426 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
miduzhe 2008-06-28
  • 打赏
  • 举报
回复
如果没有数据库字段对应,这段代码就浪费了
miduzhe 2008-06-28
  • 打赏
  • 举报
回复
数据库是如何设计的?
rta34 2007-11-02
  • 打赏
  • 举报
回复
需求是这样的,有三个DropDownList控件,分别用来选择国家,省份,和城市。他们具有依赖关系,当我选择某个国家的时候,我需要无刷新的动态加载这个国家的所有的省份,同样,当我选择某个省份的时候,我需要无刷新的选择这个省份的所有的城市。而这些国家,省份和城市的数据全部是储存在sql server数据库中。

我看了这个需求后,我打算利用AjaxToolKit中的CascadingDropDown控件加上asp.net2.0自带的DropDownList来实现。

具体过程如下:

CascadingDropDown数据控件默认的填充数据源是基于XML的,它是通过webservice去调用XML文件,通过节点来区分子节,然后加载相关的数据。

网上关于如何来加载XML数据源的例子很多,但是这里的需求决定了,我们得需要利用基于数据库的数据填充方式。

首先,我们需要在我们的web-site中建立一个webservice,它用来提供CascadingDropDown的数据源。(在最新七月的推出的版本中,这里可以不用添加webService,而是直接利用在.cs文件中添加内嵌方法的方式来设定,但不管怎么样,他们在具体实现method中是殊途同归的,这里不做过多讲述)

一般来说,有多少个CascadingDropDown,就有多少个[webMethod],但是,你也可以根据系统的条件以及自己的设计爱好,利用category属性合理的去重载这些方法。

我们在.cs代码页面添加如下代码,以方便前台页面的调用和配置。

[System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]

public static CascadingDropDownNameValue[] GetCountries(string knownCategoryValues, string category)

{

//

// 如果采用了webService架构,这里就直接去调用webService中的[webMethod],07年6月份后的版本默认都不采用webService

// 而是直接将webService中的[webMethod]实现移动到这个方法体内

//

}

然后建立数据连结池,可以利用SqlDataAdapter或者SqlDataReader来访问数据库(由于数据量小,建议使用SqlDataReader)

string selectCommand = "SELECT * FROM [dbo].[tbCountryRegion] WHERE [RegionType] = 3";

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString))

{

SqlCommand sqlcmd = new SqlCommand(selectCommand, conn);

conn.Open();

SqlDataReader reader = sqlcmd.ExecuteReader();

… …

把检索出来的数据转换成CascadingDropDownNameValue类型(该类型在using AjaxControlToolkit命名空间中)

List<CascadingDropDownNameValue> values = new List<CascadingDropDownNameValue>();

while (reader.Read())

{

values.Add(new CascadingDropDownNameValue(reader[1].ToString(), reader[0].ToString()));

}

reader.Close();

当数据为空的时候,建议设定一个默认值

if (values.Count == 0)

{

values.Add(new CascadingDropDownNameValue("中国", "000"));

}

最终利用返型来存储这些数据,

return values.ToArray();

}

最后,我们需要在aspx页面上配置我们的控件信息和属性

首先是我们的页面显示空间DropDownList

<asp:DropDownList ID=" CountryRegion " runat="server">

</asp:DropDownList>

<asp:DropDownList ID=" Province " runat="server">

</asp:DropDownList>

<asp:DropDownList ID=" CityName " runat="server">

</asp:DropDownList>

然后添加一个我们运行CascadingDropDown控件需要的脚本管理

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

</asp:ScriptManager>

最后添加主角CascadingDropDown控件,并配置相关属性和信息

<ajaxToolkit:CascadingDropDown ID="cascadingDropDownCountry" runat="server" ServiceMethod="GetCountries"

TargetControlID="CountryRegion" UseContextKey="True" Category ="provincename" PromptText="请选择国家" LoadingText="正在加载国家信息...">

</ajaxToolkit:CascadingDropDown>

<ajaxToolkit:CascadingDropDown ID="cascadingDropDownProvince" runat="server" ParentControlID="CountryRegion"

TargetControlID="Province" Category="Provinces" ServiceMethod ="GetProvincesForCountry" UseContextKey="True" PromptText="请选择省份" LoadingText="正在加载省份(地区)信息...">

</ajaxToolkit:CascadingDropDown>

<ajaxToolkit:CascadingDropDown ID="cascadingDropDownCity" runat="server" Category="city" ParentControlID="Province"

ServiceMethod="GetCitiesForProvince" TargetControlID="CityName" UseContextKey="True" PromptText="请选择城市" LoadingText="正在加载城市信息">

</ajaxToolkit:CascadingDropDown>

刚才,我们添加的[webMethod]是GetCountries,它作为CascadingDropDown控件cascadingDropDownCountry的获取数据的方法 (cascadingDropDownCountry中的ServiceMethod="GetCountries"来定义这个属性),而将它关联的是DropDownList 中 CountryRegion控件(cascadingDropDownCountry中的TargetControlID="CountryRegion"来定义)。而另外两个Province和CityName控件所关联的cascadingDropDownProvince和 cascadingDropDownCity控件呢?他们的[ServiceMethod]方法又是什么呢?我们可以看到在这两个CascadingDropDown控件的后面有一个ServiceMethod=""的属性,这个就是配置了他们的获取数据的方法。又上面的配置信息,我们可以得到他们的方法分别是CountryRegion和GetCitiesForProvince方法,这个需要我们在.cs中重新定义,类似于我们操作第一个一样。

不同的是,由于我们的第一个没有其关联的父选项DropDownList,所以,在获取数据的时候,直接就可以利用sql句获取我们想得到的数据,但是,第二个和第三个却都拥有父选项,换句话说,他们的内容是受到他们的父选项控制的,比如,我们只有在第一个DropDownList中选择了国家,我们的才能在第二个DropDownList中,动态的加载这个国家的所有地区,我们也只有选择了第二个DropDownList中的地区或省份,我们才能在第三个DropDownList中动态添加该地区或省份的所有城市。他们是具有父子之间的依赖关系的。

那么,他们之间是怎么联系的呢?答案就在代码中。

请注意,前台CascadingDropDown控件代码中的这个配置

ParentControlID="Province"

Category="city"

这两个配置的意思就是,ParentControlID定义了CascadingDropDown控件所绑定的DropDownList的控件的父选项是是什么。

而Category表示的是,它所处的类别,是用户自定义的,方便在多个CascadingDropDown控件调用一个[webMethod]的时候,实现重载。

当我们的子下拉控件绑定到父下拉的时候,根据这个控件的特色,就会产生如下的联系:

1.当父下拉控件不被选择的时候,子下拉控件是呈灰色不可操作的

2.当父下拉空间被选择的时候,子下拉空间就在其被选择后,根据父控件被选择的内容,自动加载预定信息

他们之间的联系,就是通过ParentControlID设定后,在子控件获取数据的方法体中knownCategoryValues获得。

[System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]

public static CascadingDropDownNameValue[] GetCountries(string knownCategoryValues, string category)

knownCategoryValues的传递是以字符串的形式传递的,它的主要形式如下:

"provincename:000;”

"provincename:000;”Provinces:000010;"

传递一次,它就将会随之自动的增加一次。Provincename是我们下拉框选项的显示内容(text),000是下拉框在这个显示内容下的值(value).

他们是从哪里来的呢,是从我们的父下拉控件中传递过来的,如

values.Add(new CascadingDropDownNameValue("中国", "000"));

这里面name就是“中国”,value就是“000”。

既然如此,我们就可以按照如下方式进行操作,获取父控件传递的信息,如下

方法一:截取字符串到字符串数组

string[] categoryValues = knownCategoryValues.Split(':', ';');

方法二:利用数据字典

StringDictionary kv = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);

这两种方法是殊途同归。

我采取的是第一种方法,简单易懂。

在获取上面传来的值信息之后,我们就可以进行数据检索操作,并去获取我们想要的数据了

string selectCommand = "SELECT * FROM [dbo].[tbCountryRegion] WHERE [RegionType] = 2 AND [RegionID] LIKE '" + categoryValues[1]+ "%'";

下面的过程和第一个控件的这个方法一样,利用SqlDataReader来访问数据库,把检索出来的数据转换成CascadingDropDownNameValue类型,然后进行输出。

不管有多少级下拉框,我们都可以利用这个方法来如法炮制的操作。

完成后,我们就可以设定端点F5一下,欣赏自己的劳动成果了。

Ps:我们可以利用Category属性来完成多个联动下拉菜单在一个方法中获取自己数据。

代码如下:

string[] categoryValues = knownCategoryValues.Split(':', ';');

switch (category)

{

case "city": //定义category为city的那个CascadingDropDown控件响应

string selectCommand = "SELECT * FROM [dbo].[tbCountryRegion] WHERE [RegionType] = 1";

break;

case "Provinces": //定义category为Provinces的那个CascadingDropDown控件响应

string selectCommand = "SELECT * FROM [dbo].[tbCountryRegion] WHERE [RegionType] = 2 AND [RegionID] LIKE '" + categoryValues[1] + "%'";

break;

case "Countries": //定义category为Countries的那个CascadingDropDown控件响应

string selectCommand = "SELECT * FROM [dbo].[tbCountryRegion] WHERE [RegionType] = 3 AND [RegionID] LIKE '" + categoryValues[1] + "%'";

break;

default :

break ;

}

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString);

SqlDataAdapter dbAdaper = new SqlDataAdapter(selectCommand, conn);

DataSet dbset = new DataSet();

dbAdaper.Fill(dbset, "tbCountryRegion");

DataColumn columnRegionName = dbset.Tables["tbCountryRegion"].Columns["RegionName"];

DataColumn columnRegionID = dbset.Tables["tbCountryRegion"].Columns["RegionID"];

List<CascadingDropDownNameValue> values = new List<CascadingDropDownNameValue>();



foreach (DataRow row in dbset.Tables["tbCountryRegion"].Rows)

{

values.Add(new CascadingDropDownNameValue(row[columnRegionName].ToString(), row[columnRegionID].ToString()));

}

return values.ToArray();

第1章 空 第2章 ASP.NET运行模型 21.如何在页面应用javascript脚本-示例1 21.如何在页面应用javascript脚本-示例2 22.如何实现从服务器端向页面动态添加javascript脚本-示例1 22.如何实现从服务器端向页面动态添加javascript脚本-示例2 24.如何处理多页面重定向到同一页面后的返回问题 25.如何用Response.Redirect方法传递汉字 29.如何利用输出缓存技术缓存整个页面 30.如何利用片段缓存技术对用户控件进行缓存 31.如何利用数据缓存技术提高程序的性能 33.如何实现当页面产生错误时重定向到自定义错误界面 35.如何在程序读写Web.config文件 37.如何使用CSS文件定义控件的样式 38.如何启用和禁用ViewState保存状态信息的功能 39.如何应用IsPostBack控制页面的加载 41.如何使用Trace对象进行跟踪调试(页面级) 42.如何使用#Include语法将文件添加到页面 43.如何使用编程的方式处理异常信息 44.如何将网页错误信息写入事件日志 第3章 常用Web服务控件 46.如何使用Label控件动态显示文本信息 47.如何实现当鼠标移到控件时显示提示信息 48.如何在Web应用程序实现快捷键功能(使用脚本实现) 48.如何在Web应用程序实现快捷键功能(使用属性实现) 49.如何设置页面上控件的Tab键顺序 50.如何实现用回车键代替Tab键的功能 51.如何为按钮键添加消息框 52.Button、LinkButton和ImageButton服务控件的区别及应用 54.如何使用CheckBox和CheckBoxList控件(CheckBox示例) 54.如何使用CheckBox和CheckBoxList控件(CheckBoxList示例) 55.如何使用RadioButton和RadioButtonList控件(RadioButton示例) 55.如何使用RadioButton和RadioButtonList控件RadioButtonList示例) 56.如何使用Panel控件操作一组控件 57.如何使用Table控件组织页面的内容 58.如何实现DropDownList控件选项的添加、删除等操作 59.如何实现间接改变DropDownList控件的当前选项 60.如何实现两个或多个DropDownList控件的联动 61.如何实现ListBox控件选项的上移、下移、添加和删除操作 62.如何实现ListBox控件选项的双击事件 63.如何动态设置ListBox控件各选项的背景颜色 64.如何在页面动态创建控件 65.如何为HTML服务器控件的事件添加自定义方法 第4章 验证控件 67.如何使用RequiredFieldValidator控件验证用户是否输入信息 68.如何使用RegularExpressionValidator控件验证E-mail地址和邮编等格式 69.如何使用RangeValidator控件验证输入的信息是否在指定范围内 70.如何使用CompareValidator控件对两个输入控件比较验证 71.如何使用CustomValidator控件自定义验证格式 72.如何使用ValidationSummary控件总结所有验证控件的错误信息 73.如何创建自定义功能的验证控件 74.如何禁用服务器控件的验证功能 75.如何控制页面部分验证控件有效 76.如何实现控件即时验证功能 77.如何使用验证控件综合验证用户注册页面 78.如何验证DataGrid控件的编辑列 81.如何使用验证控件验证日期类型的输入(CompareValidator) 81.如何使用验证控件验证日期类型的输入(CustomerValidator) 81.如何使用验证控件验证日期类型的输入(RegularValidator) 第5章 高级Web控件 82.如何在网页使用Calendar Web控件显示和选择日期 83.如何在Calendar Web控件控制个别日的内容及显示 84.如何在Calendar Web控件控制用户日期选定 86.如何使用XML控件显示XML文件和进行XSLT转换 87.如何使用AdRotator Web控件制作广告发布程序-示例1 87.如何使用AdRotator Web控件制作广告发布程序-示例2 88.如何创建用户控件 89.如何将Web窗体转换成用户控件 90.如何实现动态加载用户控件 92.如何使用TabStrip Web和MultiP

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧