如何从文本文件中获取键和值并在组合框中设置值
How to get key and value from text file and set value in combobox
我的 window 表单应用程序中有两个组合框。第一个组合框显示我已经从 xls 文件的数据库中获得的国家/地区的城市名称。组合框显示这样的城市名称 -
Berlin
Munich
Stuttgart //etc.
现在我写了一个文本文件,其中包含那些地方的兴趣点列表。我的文本文件看起来像
Berlin,Berlin Wall,Brandenburg Gate,Reichstag Building
Munich,Nymphenburg palace,Museum Island,Marienplatz
Stuttgart,Old Castle,Staatsgalerie Stuttgart,schlossplatz stuttgart //etc
现在我希望当一个地方出现在第一个组合框中时,所有 POI 项目将以列表形式自动生成在第二个组合框中,就像当我单击柏林时第二个组合框将显示
Berlin Wall
Brandenburg Gate
Reichstag Building
但我不确定如何进行此操作。
我的代码是-
ComboBox 1 的填充方式如下
class PlaceList
{
public static ComboBox Combo_list = new ComboBox();
public static DataGridView dataTable = new DataGridView();
public static void List()
{
var startPath = Application.StartupPath;
string folderName = Path.Combine(startPath, "POI_List");
System.IO.Directory.CreateDirectory(folderName);
string SavedfileName = "POI_list.json";
var Saving_path = Path.Combine(folderName, SavedfileName);
string fileName = "Zensus_Gemeinden_org.xlsx";
var path = Path.Combine(startPath, fileName);
String name = "Gemeinden_31.12.2011_Vergleich";
String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
path + ";Extended Properties='Excel 12.0 XML;HDR=YES;';";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand oconn = new OleDbCommand("Select [3] as City,[4] as Population, * From [" + name + "$D7:E11300] Where [4] > 10000", con);
con.Open();
OleDbDataAdapter sda = new OleDbDataAdapter(oconn);
DataTable data = new DataTable();
sda.Fill(data);
dataTable.DataSource = data;
for (int i = 0; i < data.Rows.Count; i++)
{
Combo_list.Items.Add(data.Rows[i]["City"]);
}
string Place_Json = "Place_List:" + JsonConvert.SerializeObject(data, Formatting.Indented);
File.WriteAllText(Saving_path, Place_Json);
}
}
}
然后我从From1.cs调用它就像这样
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
PlaceList.Combo_list = comboBox1;
}
}
您需要加载您的文件并逐行在字典中构建一个条目,其中键是包含城市名称的字符串,值是包含 POI 的字符串列表。然后,当您从组合中选择一个城市时,只需使用该字符串作为搜索字典的关键字
例如,这是一个完整示例,您可以使用 LinqPAD 进行测试,并展示如何读取您的 txt 文件并构建一个全局变量,使您的兴趣点以城市名称为关键字[=12] =]
Form f;
ComboBox cboCities;
ComboBox cboPoi;
Dictionary<string, List<string>> poi = new Dictionary<string, List<string>>();
void Main()
{
f = new Form();
cboCities = new ComboBox();
cboCities.DropDownStyle = ComboBoxStyle.DropDownList;
cboCities.Items.AddRange(new string[] { "Berlin", "Munich", "Stuttgart"});
cboCities.SelectedIndexChanged += cboCities_SelectedIndexChanged;
f.Controls.Add(cboCities);
cboPoi = new ComboBox();
cboPoi.Location = new System.Drawing.Point(0, 30);
f.Controls.Add(cboPoi);
foreach (string line in File.ReadLines(@"D:\temp\poi.txt"))
{
string[] parts = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
poi.Add(parts[0], new List<string>(parts.Skip(1)));
}
f.ShowDialog();
}
void cboCities_SelectedIndexChanged(object sender, EventArgs e)
{
string txt = cboCities.SelectedItem.ToString();
if (poi.ContainsKey(txt))
{
List<string> points = poi[txt];
cboPoi.Items.Clear();
cboPoi.Text = string.Empty;
cboPoi.Items.AddRange(points.ToArray());
}
}
这是我编辑过的答案:
private void button1_Click(object sender, EventArgs e)
{
LoadKeys();
}
Dictionary<string, List<string>> poi = new Dictionary<string, List<string>>();
private void LoadKeys()
{
foreach (string line in File.ReadLines("TextFile1.txt"))
{
string[] parts = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
poi.Add(parts[0], new List<string>());
poi[parts[0]] = new List<string>(parts.Skip(1));
}
}
void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedItem != null)
{
string txt = comboBox1.SelectedItem.ToString();
if (poi.ContainsKey(txt))
{
List<string> points = poi[txt];
comboBox2.Items.Clear();
comboBox2.Items.AddRange(points.ToArray());
}
}
}
我的 window 表单应用程序中有两个组合框。第一个组合框显示我已经从 xls 文件的数据库中获得的国家/地区的城市名称。组合框显示这样的城市名称 -
Berlin
Munich
Stuttgart //etc.
现在我写了一个文本文件,其中包含那些地方的兴趣点列表。我的文本文件看起来像
Berlin,Berlin Wall,Brandenburg Gate,Reichstag Building
Munich,Nymphenburg palace,Museum Island,Marienplatz
Stuttgart,Old Castle,Staatsgalerie Stuttgart,schlossplatz stuttgart //etc
现在我希望当一个地方出现在第一个组合框中时,所有 POI 项目将以列表形式自动生成在第二个组合框中,就像当我单击柏林时第二个组合框将显示
Berlin Wall
Brandenburg Gate
Reichstag Building
但我不确定如何进行此操作。
我的代码是-
ComboBox 1 的填充方式如下
class PlaceList
{
public static ComboBox Combo_list = new ComboBox();
public static DataGridView dataTable = new DataGridView();
public static void List()
{
var startPath = Application.StartupPath;
string folderName = Path.Combine(startPath, "POI_List");
System.IO.Directory.CreateDirectory(folderName);
string SavedfileName = "POI_list.json";
var Saving_path = Path.Combine(folderName, SavedfileName);
string fileName = "Zensus_Gemeinden_org.xlsx";
var path = Path.Combine(startPath, fileName);
String name = "Gemeinden_31.12.2011_Vergleich";
String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
path + ";Extended Properties='Excel 12.0 XML;HDR=YES;';";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand oconn = new OleDbCommand("Select [3] as City,[4] as Population, * From [" + name + "$D7:E11300] Where [4] > 10000", con);
con.Open();
OleDbDataAdapter sda = new OleDbDataAdapter(oconn);
DataTable data = new DataTable();
sda.Fill(data);
dataTable.DataSource = data;
for (int i = 0; i < data.Rows.Count; i++)
{
Combo_list.Items.Add(data.Rows[i]["City"]);
}
string Place_Json = "Place_List:" + JsonConvert.SerializeObject(data, Formatting.Indented);
File.WriteAllText(Saving_path, Place_Json);
}
}
}
然后我从From1.cs调用它就像这样
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
PlaceList.Combo_list = comboBox1;
}
}
您需要加载您的文件并逐行在字典中构建一个条目,其中键是包含城市名称的字符串,值是包含 POI 的字符串列表。然后,当您从组合中选择一个城市时,只需使用该字符串作为搜索字典的关键字
例如,这是一个完整示例,您可以使用 LinqPAD 进行测试,并展示如何读取您的 txt 文件并构建一个全局变量,使您的兴趣点以城市名称为关键字[=12] =]
Form f;
ComboBox cboCities;
ComboBox cboPoi;
Dictionary<string, List<string>> poi = new Dictionary<string, List<string>>();
void Main()
{
f = new Form();
cboCities = new ComboBox();
cboCities.DropDownStyle = ComboBoxStyle.DropDownList;
cboCities.Items.AddRange(new string[] { "Berlin", "Munich", "Stuttgart"});
cboCities.SelectedIndexChanged += cboCities_SelectedIndexChanged;
f.Controls.Add(cboCities);
cboPoi = new ComboBox();
cboPoi.Location = new System.Drawing.Point(0, 30);
f.Controls.Add(cboPoi);
foreach (string line in File.ReadLines(@"D:\temp\poi.txt"))
{
string[] parts = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
poi.Add(parts[0], new List<string>(parts.Skip(1)));
}
f.ShowDialog();
}
void cboCities_SelectedIndexChanged(object sender, EventArgs e)
{
string txt = cboCities.SelectedItem.ToString();
if (poi.ContainsKey(txt))
{
List<string> points = poi[txt];
cboPoi.Items.Clear();
cboPoi.Text = string.Empty;
cboPoi.Items.AddRange(points.ToArray());
}
}
这是我编辑过的答案:
private void button1_Click(object sender, EventArgs e)
{
LoadKeys();
}
Dictionary<string, List<string>> poi = new Dictionary<string, List<string>>();
private void LoadKeys()
{
foreach (string line in File.ReadLines("TextFile1.txt"))
{
string[] parts = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
poi.Add(parts[0], new List<string>());
poi[parts[0]] = new List<string>(parts.Skip(1));
}
}
void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedItem != null)
{
string txt = comboBox1.SelectedItem.ToString();
if (poi.ContainsKey(txt))
{
List<string> points = poi[txt];
comboBox2.Items.Clear();
comboBox2.Items.AddRange(points.ToArray());
}
}
}