C#(winform)读取Json中的GPS信息

目录

前言

一、Json文件及文件格式

 二、界面准备

 三、读取Json文件中的信息

1、定义用于保存数据的类

2、在界面加载事件中将文件中信息读取到列表中

a、创建保存数据的列表

b、从Json中获取gps信息并填充到GpsInfos中

c、读取Json文件的内容使用到Json相关的内容,需要添加Json的支持库

 d、初始化三个下拉框,也是创建一个函数,在load事件中调用

e、在form的load事件中调用上面两个函数

四、界面的下拉框选择,显示GPS信息,实现各个下拉框的事件

1、创建ComboBoxItem类,用于给ComboBox添加选项

2、省的选择变化事件,当省发生变化时,需要加载出省所包含的城市的ComboBox内容

3、城市的ComboBox选择变化事件,城市选择发生变化时,需要加载出区的ComboBox的值

4、区的ComboBox选择变化事件,当区的ComboBox值发生变化时,需要加载出GPS信息到文本框中

五、效果演示及demo下载

1、效果显示

 2、demo下载


前言

编写上位机时,有时候我们需要在winform界面上显示全国各地的GPS信息,这里我给大家分享一个含有GPS信息的Json文件,并分享将其中的信息读取显示到winform界面的方法,界面上根据下拉框的选择,显示不同地区的GPS信息。

一、Json文件及文件格式

 二、界面准备

需要准备三个下拉框,用于选择不同的地区;两个文本框,用于显示不同地区的GPS信息,包括经度和纬度。

 三、读取Json文件中的信息

1、定义用于保存数据的类

定义一个数据类,用于保存每条数据的信息,包括唯一ID、名称(省、市、区)、经度、纬度、唯一父ID;为了方便,我直接在界面代码中创建

/// <summary>
/// 用于保存GPS信息的类
/// </summary>
public class GpsInfoModel
{
    /// <summary>
    /// 每条信息有唯一ID
    /// </summary>
    public int ID { get; set; }
    /// <summary>
    /// 每条信息对应的名称--省、市、区
    /// </summary>
    public string CityName { get; set; }
    /// <summary>
    /// 经度
    /// </summary>
    public double GpsLon { get; set; }
    /// <summary>
    /// 纬度
    /// </summary>
    public double GpsLat { get; set; }
    /// <summary>
    /// 每条信息都有一个父ID,表示从属关系
    /// </summary>
    public int FatherID { get; set; }
}

2、在界面加载事件中将文件中信息读取到列表中

在界面加载函数中,一次性将所有数据读取到List中,Json数据中只包含了城市名称、经度和纬度信息,所以我们要在数据读取过程中,按照Json文件的结构,给每条加上数据ID和父ID,父ID就是上一级的数据ID,最上一级的父ID是0;

a、创建保存数据的列表

List<GpsInfoModel> GpsInfos = new List<GpsInfoModel>();

b、从Json中获取gps信息并填充到GpsInfos中

/// <summary>
/// 从json文件中获取本地gps信息
/// </summary>
private void GetGpsInfo()
{
    string jsonString = @"{""北京市"": { ""北京市"": { ""北京市"": [116.413384,39.910925],""东城区"": [116.422401,39.934827]}}}";
    int cityID = 1;
    //int rootFatherID = 0;
    int provinceFatherID = 0;
    int cityFatherID = 0;
    int townFatherID = 0;
    // string rootPath = System.Environment.CurrentDirectory;
    string path = @"./coordinates.json";

    using (StreamReader file = File.OpenText(path))
    {
        jsonString = file.ReadToEnd();
    }

    JObject jsonRoot = JObject.Parse(jsonString);
    foreach (JProperty province in jsonRoot.Properties())//省
    {
        GpsInfos.Add(new GpsInfoModel()
        {
            FatherID = provinceFatherID,
            ID = cityID++,
            CityName = province.Name,
            GpsLon = 0,
            GpsLat = 0
        });

        cityFatherID = cityID - 1;
        JObject citys = (JObject)province.Value;
        foreach (JProperty city in citys.Properties())//市
        {
            GpsInfos.Add(new GpsInfoModel()
            {
                FatherID = cityFatherID,
                ID = cityID++,
                CityName = city.Name,
                GpsLon = 0,
                GpsLat = 0
            });

            townFatherID = cityID - 1;
            JObject towns = (JObject)city.Value;
            foreach (JProperty town in towns.Properties())//县
            {
                JToken districtValue = town.Value;
                if (districtValue.Type == JTokenType.Array)
                {
                    JArray districtArray = (JArray)districtValue;
                    GpsInfos.Add(new GpsInfoModel()
                    {
                        ID = cityID++,
                        FatherID = townFatherID,
                        CityName = town.Name,
                        GpsLon = districtArray[0].Value<double>(),
                        GpsLat = districtArray[1].Value<double>()
                    });
                }
            }
        }
    }
}

c、读取Json文件的内容使用到Json相关的内容,需要添加Json的支持库

 

 d、初始化三个下拉框,也是创建一个函数,在load事件中调用

/// <summary>
/// 初始化gps选项的combox的内容,需要gps信息,要放在GetGpsInfo()之后调用
/// </summary>
private void InitGpsCombox()
{
    cmbProvince.Items.Clear();
    cmbCity.Items.Clear();
    cmbTwon.Items.Clear();

    var listProvinces = GpsInfos.Where(p => p.FatherID == 0).ToList();
    foreach (var province in listProvinces)
    {
        ComboBoxItem comboBoxItem = new ComboBoxItem(province.CityName, province.ID);
        cmbProvince.Items.Add(comboBoxItem);
    }

    cmbProvince.DisplayMember = "Name";
    cmbProvince.ValueMember = "ID";
    cmbProvince.SelectedIndex = 0;
    //根据联动,城市和区的ComboBox不用初始化,之后要实现省、城市的ComboBox中选择变动事件
}

e、在form的load事件中调用上面两个函数

 private void Form1_Load(object sender, EventArgs e)
{
    GetGpsInfo();
    InitGpsCombox();
}

四、界面的下拉框选择,显示GPS信息,实现各个下拉框的事件

1、创建ComboBoxItem类,用于给ComboBox添加选项

/// <summary>
/// 选择项类,用于ComboBox
/// </summary>
public class ComboBoxItem
{
    private int id = 0;
    private string name = string.Empty;
    public ComboBoxItem(string sname, int sid)
    {
        id = sid;
        name = sname;
    }
    public override string ToString()
    {
        return this.name;
    }
    public int ID
    {
        get { return this.id; }
        set { this.id = value; }
    }
    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }
}

2、省的选择变化事件,当省发生变化时,需要加载出省所包含的城市的ComboBox内容

/// <summary>
/// 省选项变化,更新城市选项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbProvince_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        cmbCity.Items.Clear();
        int parentId = ((ComboBoxItem)(cmbProvince.SelectedItem)).ID;
        var listCitys = GpsInfos.Where(p => p.FatherID == parentId).ToList();
        foreach (var city in listCitys)
        {
            ComboBoxItem comboBoxItem = new ComboBoxItem(city.CityName, city.ID);
            cmbCity.Items.Add(comboBoxItem);
        }
        cmbCity.DisplayMember = "Name";
        cmbCity.ValueMember = "ID";

        cmbCity.SelectedIndex = 0;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

3、城市的ComboBox选择变化事件,城市选择发生变化时,需要加载出区的ComboBox的值

/// <summary>
/// 城市选项变化,更新县选项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbCity_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        cmbTwon.Items.Clear();
        int parentId = ((ComboBoxItem)(cmbCity.SelectedItem)).ID;
        var listTwons = GpsInfos.Where(p => p.FatherID == parentId).ToList();
        foreach (var twon in listTwons)
        {
            ComboBoxItem comboBoxItem = new ComboBoxItem(twon.CityName, twon.ID);
            cmbTwon.Items.Add(comboBoxItem);
        }
        cmbTwon.DisplayMember = "Name";
        cmbTwon.ValueMember = "ID";
        cmbTwon.SelectedIndex = 0;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

4、区的ComboBox选择变化事件,当区的ComboBox值发生变化时,需要加载出GPS信息到文本框中

/// <summary>
/// 县选项变化,更新gps信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbTwon_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        int parentId = ((ComboBoxItem)(cmbTwon.SelectedItem)).ID;
        var gps = GpsInfos.FirstOrDefault(p => p.ID == parentId);
        txtLon.Text = gps.GpsLon.ToString();
        txtLat.Text = gps.GpsLat.ToString();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

五、效果演示及demo下载

1、效果显示

 

 

 

 2、demo下载

demo包含内容:包含GPS信息的Json文件、全部代码

下载链接:https://download.csdn.net/download/weixin_33376883/88112519

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远之后2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值