【问题标题】:Write first and second column rows in listview inside each row in a text file在文本文件的每一行内的列表视图中写入第一列和第二列行
【发布时间】:2016-10-18 19:06:14
【问题描述】:

我正在使用WinForms。在我的表单中,我有一个 listview 和一个按钮。当我单击按钮时,程序会将listview 中的所有项目写入文本文件。问题是我希望第一列和第二列在一行中。

到目前为止,这是我用来写入文本文件的代码:

            using (StreamWriter sw = File.CreateText(DirectoryPath))
            {
                foreach (ListViewItem item in listView1.Items)
                {
                    sw.WriteLine(item.Text);
                    for (int i = 1; i < item.SubItems.Count; i++)
                    {
                        sw.WriteLine(item.SubItems[i].Text);
                    }
                }
             }

我的列表视图

问题输出文本文件

我希望文本文件如何显示

【问题讨论】:

  • 您可以只使用 sw.Write(Item.Text) 而不是 WriteLine,因此在写入 Item 的文本后该行不会终止。

标签: c# .net winforms listview text-files


【解决方案1】:

怎么样

       using (StreamWriter sw = File.CreateText(DirectoryPath))
        {
            foreach (ListViewItem item in listView1.Items)
            {
                sw.Write(item.Text + ": ");
                for (int i = 1; i < item.SubItems.Count; i++)
                {
                    sw.WriteLine(item.SubItems[i].Text);
                }
            }
         }

【讨论】:

    【解决方案2】:

    您的第一个单元格“FirstPage”似乎是父项,所有其他项都是子项。假设您在答案下方只有两列将起作用。

    using (StreamWriter sw = File.CreateText(DirectoryPath))
            {
                foreach (ListViewItem item in listView1.Items)
                {
    
                    sw.Write(string.Format("{0} :",item.Text));
                    for (int i = 1; i < item.SubItems.Count; i++)
                    {
                        if (i % 2 == 0)
                        {
                            sw.Write(string.Format("{0} :",item.SubItems[i].Text));
    
                        }
                        else
                        {
                            sw.WriteLine(item.SubItems[i].Text);
                        }
                    }
                }
            }
    
    • 替代方案是;将每个新行作为新项目添加到列表视图中

          string[] row = { "FirstPage", "$1.00" };
          string[] row2 = { "SecondPage", "$1.00" };
      
          var listViewItem = new ListViewItem(row);
          listView1.Items.Add(listViewItem);
          var listViewItem2 = new ListViewItem(row2);
          listView1.Items.Add(listViewItem2);
      

      等等。您可以通过 foreach 循环进行迭代,然后使用以下灵活的代码。

         using (StreamWriter sw = File.CreateText(DirectoryPath))
          {
              foreach (ListViewItem item in listView1.Items)
              {
      
                  sw.Write(string.Format("{0} :",item.Text));
                  for (int i = 1; i < item.SubItems.Count; i++)
                  {
                      sw.WriteLine(item.SubItems[i].Text);
                  }
              }
          }
      

    【讨论】:

      【解决方案3】:

      你可以用更优雅的方式来做:

      var str = listView1.Items.Cast<ListViewItem>()
                         .Select(x => x.SubItems.Cast<ListViewItem.ListViewSubItem>())
                         .Select(x => string.Join(":", x.Select(s => s.Text)));
      System.IO.File.WriteAllLines(@"d:\file.txt", str);
      

      注意:如果你想限制列例如只保存前两列,你可以这样选择第二行的子项:x.SubItems.Cast&lt;ListViewItem.ListViewSubItem&gt;().Take(2)

      【讨论】:

      • 我喜欢 LINQ,但有时,像这样,它的主要作用是模糊代码在做什么。
      • @AgapwIesu 代码是这样工作的:Cast&lt;T&gt;() 将一个可枚举的集合转换为一个IEnumerable&lt;T&gt; 所以我们可以在它上面使用 linq 方法。所以我们得到第一行的项目列表。然后在第二行中,我们选择了一个项目的所有子项目,因此结果是一个列表,其中每个元素都包含一个项目的子项目列表。然后在第三行,我们从所有子项中选择文本并使用string.Join,使用“:”作为分隔符加入这些子项。
      • @AgapwIesu 熟能生巧。当你足够使用它时,你会像阅读 for 循环一样简单地阅读行,并且你会学习解析它,你会发现它是你可以用于这种情况的最佳解决方案之一。
      【解决方案4】:

      您应该迭代列表视图项,将每个子项相互连接,然后将连接的字符串添加到最后的文本文件中...我已经修改了您的代码:

      using (StreamWriter sw = File.CreateText(DirectoryPath))
      {
          foreach (ListViewItem item in listView1.Items)
          {
      
              string strText = "";
      
              //I'm not sure why you start at 1 and not 0, anyway:
              for (int i = 1; i < item.SubItems.Count; i++)
              {
                  strText+= " " + item.SubItems[i].Text;
              }
      
              sw.WriteLine(strText);
          }
       }
      

      【讨论】:

      • 我认为您代码中的行需要更正 strText+= " " + sw.WriteLine(item.SubItems[i].Text);实际上应该是 strText+= " " + item.SubItems[i].Text;
      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      相关资源
      最近更新 更多