用DropDownList控件绑定XML数据实现省市区三级联动(需要用到VS2005的AJAX1.0),此方法仅用于学习讨论.
主要目的是学习使用调用XML数据及用数组存储绑定DataView数据源返回所选字段唯一值.
City.xml文件格式:
<?xml version="1.0" encoding="utf-8"?>
<PCitys>
<Provinces>
<Province>北京市</Province>
<City>北京市</City>
<County>东城</County>
</Provinces>
<Provinces>
<Province>北京市</Province>
<City>北京市</City>
<County>西城</County>
</Provinces>
<Provinces>
<Province>北京市</Province>
<City>北京市</City>
<County>崇文</County>
</Provinces>
<Provinces>
<Province>北京市</Province>
<City>北京市</City>
<County>宣武</County>
</Provinces>
<Provinces>
<Province>北京市</Province>
<City>北京市</City>
<County>朝阳</County>
</Provinces>
<Provinces>
<Province>北京市</Province>
<City>北京市</City>
<County>丰台</County>
</Provinces>
<Provinces>
</PCitys>
前台显示代码(VS2005的AJAX1.0实现无刷新调数据):
<asp:ScriptManager id="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="upPCC" runat="server">
<ContentTemplate>
<asp:DropDownList ID="ddlProvince" runat="server" AppendDataBoundItems="True" AutoPostBack="True"
OnSelectedIndexChanged="ddlProvince_SelectedIndexChanged">
<asp:ListItem Selected="True" Value="选择省份">选择省份</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="ddlCity" runat="server" AppendDataBoundItems="True" AutoPostBack="True"
OnSelectedIndexChanged="ddlCity_SelectedIndexChanged">
<asp:ListItem Selected="True" Value="选择城市">选择城市</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="ddlCounty" runat="server" AppendDataBoundItems="True">
<asp:ListItem Selected="True" Value="选择市区">选择市区</asp:ListItem>
</asp:DropDownList></ContentTemplate></asp:UpdatePanel>
后台代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class EmployeeAdd : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ProvinceFill();
CityFill();
CountyFill();
}
}
/// <summary>
/// 用数组存储绑定DataView数据源返回所选字段唯一值
/// </summary>
/// <param name="dv">DataView视图</param>
/// <param name="al">数组参数</param>
/// <param name="column_name">筛选字段</param>
/// <returns>返回column_name唯一值</returns>
private ArrayList GetDistinctData(ref DataView dv, ref ArrayList al, string column_name)
{
bool existed = false;
foreach (DataRowView dr in dv)
{
existed = false;
for (int i = 0; i < al.Count; i++)
{
if (dr[column_name].ToString() == al[i].ToString())
{
existed = true;
}
}
if (existed == false)
{
al.Add(dr[column_name]);
}
}
return al;
}
/// <summary>
///绑定省市数据到控件
/// </summary>
protected void ProvinceFill()
{
//清空省市选项
ddlProvince.Items.Clear();
DataSet ds = new DataSet("Cities");
ds.Clear();
ds.ReadXml(Server.MapPath("..\\App_Data\\Citys.xml"));
DataTable dt = ds.Tables[0];
DataView pdv = new DataView(dt);
ArrayList pal = new ArrayList();
GetDistinctData(ref pdv, ref pal, "Province");
ddlProvince.DataSource = pal;
ddlProvince.DataBind();
}
/// <summary>
/// 绑定所选省市下的城市或地区到控件
/// </summary>
protected void CityFill()
{//清空城市地区选项
ddlCity.Items.Clear();
DataSet ds = new DataSet("Cities");
ds.Clear();
ds.ReadXml(Server.MapPath("..\\App_Data\\Citys.xml"));
DataTable dt = ds.Tables[0];
DataView cdv = new DataView(dt);
cdv.RowFilter = "Province='" + ddlProvince.SelectedItem.Text + "'";
ArrayList cal = new ArrayList();
GetDistinctData(ref cdv, ref cal, "City");
ddlCity.DataSource = cal;
ddlCity.DataBind();
}
/// <summary>
/// 绑定数据到所选城市或地区管辖下的县市到控件
/// </summary>
protected void CountyFill()
{
//清空市县选项
ddlCounty.Items.Clear();
DataSet ds = new DataSet("Cities");
ds.Clear();
ds.ReadXml(Server.MapPath("..\\App_Data\\Citys.xml"));
DataTable dt = ds.Tables[0];
DataView ctdv = new DataView(dt);
ctdv.RowFilter = "Province='" + ddlProvince.SelectedItem.Text + "' and City='" + ddlCity.SelectedItem.Text + "'";
ArrayList ctal = new ArrayList();
GetDistinctData(ref ctdv, ref ctal, "County");
ddlCounty.DataSource = ctal;
ddlCounty.DataBind();
}
protected void ddlProvince_SelectedIndexChanged(object sender, EventArgs e)
{
CityFill();
CountyFill();
}
protected void ddlCity_SelectedIndexChanged(object sender, EventArgs e)
{
CountyFill();
}
}
刚学.NET,此方法仅用于学习.如有好方法请多多指教.谢谢!