將地址切開成縣市、鄉鎮市區與其他地址
這篇主要是記錄一下自己所遇到的一個問題,現在有一串地址,要將他切開為縣市、鄉鎮市區與其他地址分別塞到控制項中,以下說明我的作法。
這裡先給個畫面讓大家看到最後的結果,將一串地址拆開並將台東縣、太麻里鄉對應到兩個 DropDownList,剩餘地址對應到 TextBox 中。(這裡並沒有做縣市和鄉鎮市區的連動功能)
以下先說明大致的作法,然後再最後給出程式碼
- 通常在寫網站系統的時候,會將縣市、鄉鎮市區等等資料存到資料庫中,但是我們這裡只是個簡單範例,所以我直接再程式碼中產出這些資料並將他們塞進兩個 List<> 中,來假裝是資料庫的資料來源。
- 我觀察到縣市名稱都只有三個字,所以取得縣市名稱就只使用 Substring() 來取得。
- 當取得縣市名稱之後就可以在 List<> 中找到所對應的縣市代碼,用這個縣市代碼就可以取得所屬鄉鎮市區。
- 然後用所得到的鄉鎮市區來對應地址,找到地址字串的鄉鎮市區及其代碼。
- 最後就可以用得到的縣市代碼、鄉鎮市區代碼來對應兩個 DropDownList,剩下來的地址對應到 TextBox 裡,結束。
程式碼:
<div>
這是待宰的地址:<asp:Label ID="lbAddress" runat="server" Text="台東縣太麻里鄉中山路1號"></asp:Label><br />
<asp:Button ID="btnCut"
runat="server" Text="我切!" onclick="btnCut_Click" /><br />
<asp:DropDownList ID="ddlCity" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="ddlCountry" runat="server">
</asp:DropDownList>
<asp:TextBox ID="txtOtherAddress" runat="server"></asp:TextBox>
<br />
</div>
</form>
private List<Country> countryList;
protected void Page_Load(object sender, EventArgs e)
{
createData(); // 產生縣市、鄉鎮市區資料
if (!IsPostBack)
{
// 將兩個DropDownList的資料繫結起來
bindCityList();
bindCountryList();
}
}
/// <summary>
/// 繫結 縣市 ddlCity
/// </summary>
private void bindCityList()
{
var city = from c in cityList
select c;
ddlCity.DataSource = city;
ddlCity.DataTextField = "cityName";
ddlCity.DataValueField = "cityID";
ddlCity.DataBind();
}
/// <summary>
/// 繫結 鄉鎮市區 ddlCountry
/// </summary>
private void bindCountryList()
{
var country = from c in countryList
select c;
ddlCountry.DataSource = country;
ddlCountry.DataTextField = "countryName";
ddlCountry.DataValueField = "countryID";
ddlCountry.DataBind();
}
// 下面的資料通常會存在資料庫中,不過在這個範例我們把資料丟進List<>裡面
#region 資料
public class City
{
public string cityID { get; set; }
public string cityName { get; set; }
}
public class Country
{
public string cityID { get; set; }
public string countryID { get; set; }
public string countryName { get; set; }
}
private void createData()
{
// 全台所有縣市
cityList = new List<City>
{
new City { cityID="1", cityName="台北市" },
new City { cityID="2", cityName="基隆市" },
new City { cityID="3", cityName="新北市" },
new City { cityID="4", cityName="連江縣" },
new City { cityID="5", cityName="宜蘭縣" },
new City { cityID="6", cityName="新竹市" },
new City { cityID="7", cityName="新竹縣" },
new City { cityID="8", cityName="桃園縣" },
new City { cityID="9", cityName="苗栗縣" },
new City { cityID="10", cityName="台中市" },
new City { cityID="11", cityName="彰化縣" },
new City { cityID="12", cityName="南投縣" },
new City { cityID="13", cityName="嘉義縣" },
new City { cityID="14", cityName="雲林縣" },
new City { cityID="15", cityName="台南市" },
new City { cityID="16", cityName="高雄市" },
new City { cityID="17", cityName="澎湖縣" },
new City { cityID="18", cityName="金門縣" },
new City { cityID="19", cityName="屏東縣" },
new City { cityID="20", cityName="台東縣" },
new City { cityID="21", cityName="花蓮縣" }
};
// 因為是範例,所以只取台東縣的鄉鎮市區
countryList = new List<Country>
{
new Country { cityID = "20", countryID="1", countryName="臺東市" },
new Country { cityID = "20", countryID="2", countryName="成功鎮" },
new Country { cityID = "20", countryID="3", countryName="關山鎮" },
new Country { cityID = "20", countryID="4", countryName="卑南鄉" },
new Country { cityID = "20", countryID="5", countryName="大武鄉" },
new Country { cityID = "20", countryID="6", countryName="東河鄉" },
new Country { cityID = "20", countryID="7", countryName="長濱鄉" },
new Country { cityID = "20", countryID="8", countryName="鹿野鄉" },
new Country { cityID = "20", countryID="9", countryName="池上鄉" },
new Country { cityID = "20", countryID="10",countryName="綠島鄉" },
new Country { cityID = "20", countryID="11",countryName="延平鄉" },
new Country { cityID = "20", countryID="12",countryName="海端鄉" },
new Country { cityID = "20", countryID="13",countryName="達仁鄉" },
new Country { cityID = "20", countryID="14",countryName="金峰鄉" },
new Country { cityID = "20", countryID="15",countryName="蘭嶼鄉" },
new Country { cityID = "20", countryID="16",countryName="太麻里鄉"}
};
}
#endregion
/// <summary>
/// 切切切按鈕,按下去就會幫你把地址切開囉!
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnCut_Click(object sender, EventArgs e)
{
string address = lbAddress.Text; // 原本的地址
string cityName = string.Empty; // 存縣市名稱
string countryName = string.Empty; // 存鄉鎮市區
string otherAddress = string.Empty; // 存剩下的地址(路名、號等等地址)
// 因為縣市都是三個字,所以這裡直接切三個字出來
cityName = address.Substring(0, 3);
// 把原來的地址減去縣市名稱
// 現在的地址剩下 鄉鎮市區+其他地址
address = address.Replace(cityName, "");
// 取得縣市的ID,為了繫結 DropDownList 用
var city = from c in cityList
where c.cityName == cityName
select c;
string cityID = city.First().cityID;
// 用縣市找他的所屬鄉鎮市區
var country = from c in countryList
where c.cityID == cityID
select c;
// 找出符合的鄉鎮市區名稱和鄉鎮市區ID
string countryID = string.Empty;
foreach (var item in country)
{
if (address.Contains(item.countryName))
{
countryName = item.countryName;
countryID = item.countryID;
}
}
// 把地址減掉鄉鎮市區名稱 剩下其他地址
address = address.Replace(countryName, "");
otherAddress = address;
// 把得到的三部分地址塞回控制項秀出來
ddlCity.SelectedValue = cityID;
ddlCountry.SelectedValue = countryID;
txtOtherAddress.Text = otherAddress;
}
以上是我對於將地址切分為縣市、鄉鎮市區及其他地址的作法,如果有更好的作法,也請各位前輩多多指教。