表單需「縣市 → 鄉鎮市區」二級下拉聯動。封裝為 `UserControl` (`.ascx`),支援 `SelectedValue` 雙向繫結,可重複使用於多個頁面。
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Area.ascx.cs" Inherits="Area" %>
<asp:DropDownList ID="ddlProvince" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlProvince_SelectedIndexChanged"></asp:DropDownList>
<asp:DropDownList ID="ddlCity" runat="server"></asp:DropDownList>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI.WebControls;
public partial class Area : System.Web.UI.UserControl
{
// 對外屬性:雙向繫結 SelectedValue
public string ProvinceValue
{
get => ddlProvince.SelectedValue;
set
{
ddlProvince.ClearSelection();
var item = ddlProvince.Items.FindByValue(value);
if (item != null) item.Selected = true;
}
}
public string CityValue
{
get => ddlCity.SelectedValue;
set
{
ddlCity.ClearSelection();
var item = ddlCity.Items.FindByValue(value);
if (item != null) item.Selected = true;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindProvinces();
ddlCity.Items.Insert(0, new ListItem("- 請選擇鄉鎮市區 -", ""));
}
}
private void BindProvinces()
{
using (var conn = new SqlConnection(DbHelper.ConnectionString))
using (var cmd = new SqlCommand("SELECT ProvinceCode, ProvinceName FROM Provinces ORDER BY DisplayOrder", conn))
{
conn.Open();
ddlProvince.DataSource = cmd.ExecuteReader();
ddlProvince.DataTextField = "ProvinceName";
ddlProvince.DataValueField = "ProvinceCode";
ddlProvince.DataBind();
ddlProvince.Items.Insert(0, new ListItem("- 請選擇縣市 -", ""));
}
}
protected void ddlProvince_SelectedIndexChanged(object sender, EventArgs e)
{
ddlCity.Items.Clear();
string provinceCode = ddlProvince.SelectedValue;
if (!string.IsNullOrEmpty(provinceCode))
{
using (var conn = new SqlConnection(DbHelper.ConnectionString))
using (var cmd = new SqlCommand("SELECT CityCode, CityName FROM Cities WHERE ProvinceCode=@ProvinceCode ORDER BY DisplayOrder", conn))
{
cmd.Parameters.AddWithValue("@ProvinceCode", provinceCode);
conn.Open();
ddlCity.DataSource = cmd.ExecuteReader();
ddlCity.DataTextField = "CityName";
ddlCity.DataValueField = "CityCode";
ddlCity.DataBind();
}
}
ddlCity.Items.Insert(0, new ListItem("- 請選擇鄉鎮市區 -", ""));
}
}
CREATE TABLE Provinces (
ProvinceCode CHAR(5) PRIMARY KEY, -- 如 'TW-TPQ' (台北市)
ProvinceName NVARCHAR(50) NOT NULL,
DisplayOrder INT DEFAULT 0
);
CREATE TABLE Cities (
CityCode CHAR(8) PRIMARY KEY, -- 如 'TW-TPQ-ZH' (中正區)
ProvinceCode CHAR(5) NOT NULL REFERENCES Provinces(ProvinceCode),
CityName NVARCHAR(50) NOT NULL,
DisplayOrder INT DEFAULT 0
);
<%@ Register TagPrefix="uc" TagName="Area" Src="~/Controls/Area.ascx" %>
<uc:Area ID="ucArea" runat="server" />
<asp:Button ID="btnSave" runat="server" Text="儲存" OnClick="btnSave_Click" />
protected void btnSave_Click(object sender, EventArgs e)
{
string province = ucArea.ProvinceValue;
string city = ucArea.CityValue;
// 存入資料庫...
}
將二級下拉聯動封裝為 `UserControl`,暴露 `ProvinceValue`/`CityValue` 屬性支援雙向繫結,配合參數化查詢與資料快取,即得一個可重用、安全、高效能的地址選擇元件。後續可依專案需求擴充為三級聯動或 AJAX 版本。