将listView内容保存到文件中

时间:2014-05-02 23:19:06

标签: c# listviewitem

我正在尝试保存listView的内容。 但是我遇到了一些问题。在我的文本文件中,它将如下所示:

ListViewItem: {1234};ListViewSubItem: {daily};ListViewSubItem: {Backup};ListViewSubItem: {Every 2 days at: 23:0};ListViewSubItem: {};ListViewSubItem: {}

但我不喜欢它将“ListViewItem:”和“ListViewSubItem:”等添加到我的数据中......我只想在{}中找到这些字符串。

这是我的代码:

        FileStream file = new FileStream(dataFolder + "\\BukkitGUI\\schedule.txt", FileMode.OpenOrCreate, FileAccess.Write);
        StreamWriter sw = new StreamWriter(file);

        foreach (ListViewItem listItem in listView1.Items)
        {
            sw.WriteLine(listItem + ";" + listItem.SubItems[1] + ";" + listItem.SubItems[2] + ";" + listItem.SubItems[3] + ";" + listItem.SubItems[4] + ";" + listItem.SubItems[5]);
        }

        sw.Close();
        file.Close();

对此有何帮助?

编辑:我的listView图片: enter image description here

3 个答案:

答案 0 :(得分:1)

您的代码执行此操作:

foreach (ListViewItem listItem in listView1.Items)
{
    sw.WriteLine(listItem + ";" + listItem.SubItems[1] + ";" + listItem.SubItems[2] + ";" + listItem.SubItems[3] + ";" + listItem.SubItems[4] + ";" + listItem.SubItems[5]);
}

这是在执行以下操作:

foreach (ListViewItem listItem in listView1.Items)
{
    string listItemString = listItem.ToString();
    // etc.
}

您认为listItem.ToString()的价值是什么?

object.ToString()的默认实现只输出该类型的名称。 ListViewItemListViewSubItem的实现显然输出了类型的名称,以及项目或子项目的内容。

如果你想要不同的输出,那么你需要自己做。输入listItem.TextlistItem.SubItems[n].Text代替。

答案 1 :(得分:0)

问:如果您的输入数据是JSON格式,那么您最好的选择是获得JSON解析器吗?

例如:

否则,如果它只是一个有趣的格式",请查看.Net TextFieldParser:

答案 2 :(得分:0)

将它发布为评论太长了所以我会写一个答案。我希望至少它会给你一个很好的方向来处理它。一般来说,你需要一些方法来操纵字符串。我想到了很多选项,但在你的情况下,我认为使用regex或正则表达式是最好的选择,因为它们功能强大,你对.txt文件中应包含的内容有明确的标准不是,你使用相对少量的数据,所以即使正则表达式被认为比其他选项慢,在你的情况下我认为这不会是一个问题。

这是我尝试过的 - 只是创建了一个静态方法(某种辅助方法),它将为您清理字符串,以便您只获得所需的信息。方法本身是:

    public static string ParseListView(string ListViewText)
    {
        var regex = new System.Text.RegularExpressions.Regex("{.*?}");
        var match = regex.Match(ListViewText);

        return match.ToString().TrimStart('{').TrimEnd('}');
    }

非常简单的方法。如果需要更好地适应您的情况,您可以调整很多事情。例如,我使用的regex.Match()仅返回第一个匹配项,但您可能会发现regex.Matches()更适合您。当您在C#中使用正则表达式时,还有很多其他选项,所以请务必查看它们。

然后在你foreach循环你:

foreach (ListViewItem listItem in listView1.Items)
        {
            sw.WriteLine(ParseListView(listItem) + ";" + ParseListView(listItem.SubItems[1]) + ";" + ParseListView(listItem.SubItems[2]) + ";" + ParseListView(listItem.SubItems[3]) + ";" + ParseListView(listItem.SubItems[4]) + ";" + ParseListView(listItem.SubItems[5]));
        }

当然这看起来很难看,所以foreach循环中的逻辑最有可能得到改善,但我认为这会让你顺利。