我正在创建一个程序,对我在列表框中添加的人员的姓名进行编目,并在关闭程序时将所有内容保存到文件中。
该文件的每一行都是针对一个人的:
Tommy
Marco
James
Dylan
程序启动时,会加载文件数据并将名称添加到列表框中
这一切都很有效,但现在我在制作其他东西方面遇到了麻烦
列表中的每个人都需要一个变量来表明它是否已付款,我想将此变量与他的名字一起保存在文件中。
为此,我有:
bool paid;
private void checkbox_Paid_CheckedChanged(object sender, EventArgs e)
{
paid = true;
}
我只有一个复选框,根据事件中的选择,它需要与列表框中的每个人不同:
private void listDOF_SelectedIndexChanged(object sender, EventArgs e)
{
}
但我不知道如何在文件中为每个人写这个bool,将文件与名称一起保存并加载。
我尝试过类似的东西:
foreach(string purchasers in listDOF.Items)
{
arq.WriteLine(purchases, paid);
}
显然这不起作用,我不知道如何为每个购买者分配bool并将其写入文件。
我在WFA中使用.NET 4.5
在此之前,如果我能够做到这一点,我将向知识迈出一大步。
答案 0 :(得分:3)
首先,我会将这些人存放在申请表的清单中,否则您只会为申请中的所有人提供一个布尔,并且每个人都将被设置为付款或不付款。
public class Person
{
public string Name { get; set; }
public bool Payed { get; set; }
}
public List<Person> Persons { get; set; }
简单的方法是将其保存在SCV文件中。字段之间的分号和每个帖子的新行
Tommy; true
Marco; true
然后像这样保存
foreach(var person in Persons)
{
arq.WrtieLine("{0};{1}", person.Name, person.Payed);
}
答案 1 :(得分:1)
我相信这是将您的文本文件转换为JSON的好例子。
例如:
[
{ name: "Tom", hasPaid: true },
{ name: "Matias", hasPaid: false } // Urgh!
]
在C#中,您可以使用匿名对象构建此JSON:
List<object> people = new List<object>();
people.Add(new { Name = "Tom", HasPaid = true });
最后,您可以使用JSON.NET序列化为JSON:
File.WriteAllText(@"C:\myfile.json", JsonConvert.SerializeObject(people));
...或反序列化它:
List<object> people = JsonConvert.DeserializeObject<List<object>>(File.ReadAllText(@"C:\myfile.json"));
也许你应该使用一个具体的类而不是一个无趣的对象,因为后者是不可改变的,如果你需要将对象列表数据绑定到整个ListBox
,你就会遇到麻烦
你可以声明一个这样的简单类:
public class Person
{
public string Name { get; set; }
public bool HasPaid { get; set; }
}
......以这种方式添加人员:
List<Person> people = new List<Person>();
Person person = new Person();
person.Name = "Tom";
person.HasPaid = true;
people.Add(person);
File.WriteAllText(@"C:\myfile.json", JsonConvert.SerializeObject(people));
当涉及反序列化整个JSON数组时:
List<Person> people = JsonConvert.DeserializeObject<List<Person>(File.ReadAllText(@"C:\myfile.json"));
您似乎不知道可以将列表绑定到Windows窗体控件。请参阅示例the following MSDN article。
您可以使用List<T>
代替BindingList<T>
。 Check this CodeProject guide
这样,当您向整个BindingList<T>
添加项目时,ListBox
控件将自动填充。如果删除一个,它也将从UI中消失。
如果您利用数据绑定(在Web开发中,例如 KnockoutJS !),Windows窗体和Windows Presentation Foundation都是强大且高效的。