【问题标题】:c# - Saving parameters in a textfilec# - 将参数保存在文本文件中
【发布时间】:2014-08-27 15:07:01
【问题描述】:


我正在制作一个程序,该程序将我添加到列表框中的人员的姓名编入目录,并在您关闭程序时将所有内容保存到文件中。
文件的每一行都是针对一个人的:

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);
}

显然这不起作用,我不知道如何为每个购买者分配布尔值并将其写入文件中。
我在 WFA 中使用 .NET 4.5。
在此先谢谢大家,如果我能做到这一点,我将朝着知识迈出一大步。

【问题讨论】:

  • 有很多关于如何实现这一点的选项。最后,您需要建立一个字符串来反映您要写入文件的行。试试arq.WriteLine("{0} {1}", purchases, paid);for example
  • 使用 Person 类填充列表框,然后将人员保存到 xml 文件是我的建议(查找序列化)
  • 首先您需要决定要使用哪种文件格式。我想在你的情况下我会选择 csv。然后一行一行地写:Tommy,true 等等。当您阅读该行时,只需用分隔符 (,) 将其拆分,然后分析第二个字符串是真还是假。
  • @Christian.K 这似乎是正确的方法,它在文件中写入名称和变量,但是当加载到列表框时,加载像“Tommy False”,如果我选中复选框,然后在下一次加载“Tommy False True”。我需要为每个人分配,不要被程序识别为字符串。

标签: c# .net


【解决方案1】:

首先,我会将人员存储在应用程序的列表中,否则应用程序中的所有人员将只有一个布尔值,并且每个人都将被设置为已付款或未付款。

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);
}

【讨论】:

  • 但是如何在 checkbox_check 事件中使用这个呢?
  • 在您的情况下,我将从列表框中获取选定的名称,然后在“人员”列表中选择具有相同名称的人员,然后将“已付款”设置为复选框的值。另一种方法是将 Persons 数据绑定到列表框,并通过列表框上的 SelectedItem 属性获取选定的人。我还会在 Person 类上使用唯一标识符。
【解决方案2】:

我相信这是将您的文本文件转换为 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"));

更新 2

您似乎不知道可以将列表绑定到 Windows 窗体控件。参见例如the following MSDN article

您可以使用BindingList&lt;T&gt; 代替List&lt;T&gt;Check this CodeProject guide.

这样,当您将项目添加到整个 BindingList&lt;T&gt; 时,ListBox 控件将自动填充。如果您删除一个,它也会从 UI 中消失。

如果您利用数据绑定(同样在 Web 开发中,例如 KnockoutJS!),Windows 窗体和 Windows Presentation Foundation 都非常强大且高效。

【讨论】:

  • 那太好了,我的朋友!但是我的项目实际上可以加载文件,如果它存在,当程序启动时以及在应用程序的使用过程中,用户可以在 ListBox 中添加或删除 pesons。当程序关闭时,所有数据都会被保存。我添加了新的人,他们从一个文本框中输入了文本:listaDOF.Items.Add(box_AddPerson.Text);在关闭事件中,如果列表框有名称,它们将保存在文件中,如果没有,则不创建文件。以防万一,我有一个复选框可以为列表中的选定人员分配变量。这种方式如何实现变量加名字?
  • 人物列表需要从列表框中获取姓名,并根据列表中选中人物的复选框值翻转变量。
  • @Hypister 您需要使用数据绑定,在其中定义“名称”是列表框的显示文本,并在后台设置HasPaid
  • 我已经在点击事件中尝试了这个添加人的按钮:if(box_AddPerson.TextLength != 0) { Person purchaser = new Person(); purchaser.Name = box_AddPerson.Text; purchaser.Paid = false; Purchasers.Add(purchaser); listaJogs.Items.Add(purchaser.Name); box_AddPerson.Text = ""; }
  • 这个添加就行了,但是当我在程序的关闭事件中保存文件时:File.WriteAllText(file, JsonConvert.SerializeObject(Person));文件没有写上名字。该文件只是包含“[]”并且在程序的加载事件中,我尝试使用:List&lt;Person&gt; Purchasers = JsonConvert.DeserializeObject &lt;List&lt;Person&gt;(File.ReadAllText(file)); listDOF.Items.AddRange(Purchasers);这不起作用,我有错误。
猜你喜欢
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多