目录
c、读取Json文件的内容使用到Json相关的内容,需要添加Json的支持库
d、初始化三个下拉框,也是创建一个函数,在load事件中调用
1、创建ComboBoxItem类,用于给ComboBox添加选项
2、省的选择变化事件,当省发生变化时,需要加载出省所包含的城市的ComboBox内容
3、城市的ComboBox选择变化事件,城市选择发生变化时,需要加载出区的ComboBox的值
4、区的ComboBox选择变化事件,当区的ComboBox值发生变化时,需要加载出GPS信息到文本框中
前言
编写上位机时,有时候我们需要在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