65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Mobile 位置 ComboBox 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2009年5月30日

CPOL

3分钟阅读

viewsIcon

23609

downloadIcon

818

一组预填充的国家、地区和城市组合框,适用于 .NET Compact Framework。

引言

本文介绍如何创建一组独立的 ComboBox 控件,这些控件从预定义的非数据库列表中显示国际国家/地区和城市选择。 这些控件适合于小型 DLL,不需要 Compact SQL Server 即可执行。

背景

我正在开发一个 WM6 应用程序,该应用程序要求用户提供人口统计数据,例如国家/地区、州/省/地区和城市。 数据最终将传输到 Web 服务,因此我需要标准化的响应。 因此,我必须提供位置列表。

用户不喜欢滚动浏览成千上万个州和城市的长列表。 我希望这些控件足够智能,可以在选择新的国家或地区时重建地区和城市列表。 如果您选择“美国 > 密歇根州”,我只希望在 CityComboBox 上显示密歇根州的城市。

WM6LocationComboBox/CountryRegionCity.jpg

但是,我不希望依赖需要 Microsoft SQL Server Compact Framework 的数据库。 用户必须在其移动设备上加载大型框架才能实现一个小功能,这没有意义。 我也不想与外部 Web 数据源集成,因为在移动环境中并非始终可以进行互联网连接。

我在 GeoBytes.com 找到了一个很棒的国家、地区和城市来源。 我对数据进行了一些处理,以将其修剪到尽可能小的尺寸。 我没有将其添加到数据库中,而是将 CSV 文件直接嵌入到控件中,以便只需分发 DLL。

使用代码

该解决方案分为两个项目。 CountryRegionComboBox 项目提供两个 ComboBox 控件:国家和地区。 它不提供 City ComboBox,因为它增加了大量数据。 当您不需要城市并希望节省宝贵的移动磁盘空间时,可以使用此程序集。

CountryRegionCityComboBox 包括一个 408 KB 的城市列表。 我通过组合同名的城市,将它们的地区 ID 列在一起,从而稍微缩小了它。 如果您需要城市并且不介意额外的大小,请使用此程序集。

嵌入列表

控件使用 System.Reflection.AssemblyGetManifestResourceStream() 方法读取嵌入的数据文件。 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 - 初始提交。
© . All rights reserved.