【问题标题】:C# Saving ListViewItem: SubItems and Tags to textfileC# 保存 ListViewItem:子项和标签到文本文件
【发布时间】:2016-12-14 20:14:51
【问题描述】:

我正在为自己开发 Winforms 项目,基本上我有一个带有 ListView(listView1) 的表单,我在这个项目上有很多控件和子表单以及诸如此类的东西,无论如何我最初的目标是保存输入的数据将 ListViewItem 转换为“.txt”文件,其中每个项目用逗号 (,) 分隔。

最初这很好用,但是我后来调整了我的应用程序,也将数据添加到每个 listView1.SelectedItem[i].Tag",这也很好用,但我忘了重新审视事物的节省方面...

所以我有这个公式是有人在 StackOverflow 上提交的(对不起,我不知道它是谁,也不记得/找到链接):

        private StringBuilder ReadingListView()
    {
        string delimiter = ",";
        List<string> values;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < listView1.Items.Count; i++)
        {
            values = new List<string>();
            for (int j = 0; j < listView1.Items[i].SubItems.Count; j++)
            {
                values.Add(listView1.Items[i].SubItems[j].Text);
            }

            sb.AppendLine(string.Join(delimiter, values.ToArray()));
        }
        return sb;
    }

这真的很好,它节省了我很多时间,有人可以举一个例子来说明如何调整它来保存“listView1.Items[i].Tag”吗?我无法让我的大脑发挥作用和锻炼,为什么我不能适应它来支持添加“标签”,这是我已经坚持了几个小时的东西,我知道有一个简单的解决方案,但 ARGH!我一直在尝试很多方法,但不知道该怎么做。

【问题讨论】:

  • 我在使用这些方面的东西,但它没有以正确的顺序在 txt 文件中添加“标签”:values.Add(listView1.Items[i].Tag.ToString()) ;只需将其添加到 values.Add(listView1.Items[i].SubItems[j].Text);不会以正确的顺序将其放入文本文件中,由于循环,它还将不断重复“标记”每个子项出现的相同次数。在“for循环”下面添加它效果很好,它在脚本末尾添加了一个“标签”,失败是我希望它成为脚本中的第二项而不是最后一项。
  • 那么,数据的预期顺序是什么?你能举个例子吗? listItems 长什么样子,txt 文件长什么样子?
  • 所以我决定将特定项目添加到一个数组中,这样我就可以在 txt 文件中按顺序排列它们。

标签: c# winforms listviewitem


【解决方案1】:

我的大脑刚刚醒来,我意识到我只需要按照我希望将数据保存在文本文件中的方式创建一个数组,并将 for 循环更改为不那么复杂:

        private StringBuilder ReadingListView()
    {
        string delimiter = ",";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < listView1.Items.Count; i++)
        {
            string[] arr = new string[5];
            arr[0] = listView1.Items[i].SubItems[0].Text;
            arr[1] = listView1.Items[i].SubItems[1].Text;
            arr[2] = listView1.Items[i].Tag.ToString();
            arr[3] = listView1.Items[i].SubItems[3].Text;
            arr[4] = listView1.Items[i].SubItems[4].Text;
            sb.AppendLine(string.Join(delimiter, arr.ToArray()));
        }
        return sb;
    }

感谢您尝试帮助@Nino,如果您有更好的解决方案,请告诉我。

【讨论】:

  • 就是这样,不需要更好的解决方案:)
  • @Nino 我刚刚意识到......如果我执行上述操作,如果数组里面什么都没有怎么办?它保存得很好,但是如果我想打开 txt 文件并将这些数组恢复到列表视图,如果它们中的任何一个为空,则数组将被重新排列......你将如何使用 AppendLine 也为那些空白添加空格物品?
  • 如果数组为空,StringBuilder 字符串看起来像,,,,(用逗号分隔的空字符串)。但是,要将空字符串替换为空格,您可以执行以下操作:arr[0] = string.IsNullOrEmpty(listView1.Items[i].SubItems[0].Text) ? " " : listView1.Items[i].SubItems[0].Text; 或者您可以编写扩展方法。
  • @Nino 不错哈哈,我在想:for (int ii = 0; ii
  • 将序列化视为将数据保存到文件的正确方法。看看这个article
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多