Windows Mobile 位置 ComboBox 控件






4.33/5 (2投票s)
一组预填充的国家、地区和城市组合框,适用于 .NET Compact Framework。
引言
本文介绍如何创建一组独立的 ComboBox 控件,这些控件从预定义的非数据库列表中显示国际国家/地区和城市选择。 这些控件适合于小型 DLL,不需要 Compact SQL Server 即可执行。
背景
我正在开发一个 WM6 应用程序,该应用程序要求用户提供人口统计数据,例如国家/地区、州/省/地区和城市。 数据最终将传输到 Web 服务,因此我需要标准化的响应。 因此,我必须提供位置列表。
用户不喜欢滚动浏览成千上万个州和城市的长列表。 我希望这些控件足够智能,可以在选择新的国家或地区时重建地区和城市列表。 如果您选择“美国 > 密歇根州”,我只希望在 CityComboBox 上显示密歇根州的城市。
但是,我不希望依赖需要 Microsoft SQL Server Compact Framework 的数据库。 用户必须在其移动设备上加载大型框架才能实现一个小功能,这没有意义。 我也不想与外部 Web 数据源集成,因为在移动环境中并非始终可以进行互联网连接。
我在 GeoBytes.com 找到了一个很棒的国家、地区和城市来源。 我对数据进行了一些处理,以将其修剪到尽可能小的尺寸。 我没有将其添加到数据库中,而是将 CSV 文件直接嵌入到控件中,以便只需分发 DLL。
使用代码
该解决方案分为两个项目。 CountryRegionComboBox 项目提供两个 ComboBox
控件:国家和地区。 它不提供 City ComboBox
,因为它增加了大量数据。 当您不需要城市并希望节省宝贵的移动磁盘空间时,可以使用此程序集。
CountryRegionCityComboBox 包括一个 408 KB 的城市列表。 我通过组合同名的城市,将它们的地区 ID 列在一起,从而稍微缩小了它。 如果您需要城市并且不介意额外的大小,请使用此程序集。
嵌入列表
控件使用 System.Reflection.Assembly
和 GetManifestResourceStream()
方法读取嵌入的数据文件。 CSV 文件设置为嵌入资源,因此在编译时会包含在 DLL 中。
// Get the executing assembly
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
// Get the embedded resource file and create a stream.
Stream CountryFileStream =
asm.GetManifestResourceStream("CountryRegionCityControls.Countries.csv");
跨控件事件
当您选择一个新的国家/地区时,国家/地区控件需要触发一个事件,该事件由地区控件拦截。 然后,地区控件将重建其列表以显示所选国家/地区的地区、州、省等。
为此,我使用了静态类,这些静态类为每个控件触发事件。 由于这些类是静态的,因此每个类只有一个实现,所有控件都可以访问。 如果两个控件位于同一窗体上,一个控件将在另一个控件中触发事件,而它们都不会意识到另一个控件的存在。
public static class DetectCountryChange
{
public static event CountryChangedDelegate CountryChanged;
public static void FireCountryChanged(Country Country)
{
if (CountryChanged != null)
CountryChanged(new CountryChangedEventArgs(Country));
}
}
要订阅 CountryChanged
事件,可以将事件订阅添加到 Region 控件的构造函数中
public RegionsComboBox()
{
InitializeComponent();
// Attach to the CountryComboBox CountryChanged event
// to trigger region list rebuild.
DetectCountryChange.CountryChanged +=
new CountryChangedDelegate(DetectCountryChange_CountryChanged);
}
当 CountryComboBox
更改时,它会调用 FireCountryChanged()
方法,该方法会触发 CountryChanged
事件,该事件会被 RegionsComboBox
拦截。
历史
- 2009.05.29 - 初始提交。