在文本文件的每一行内的listview中写入第一和第二列行

时间:2016-10-18 19:06:14

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

我正在使用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);
                    }
                }
             }

我的列表视图

My list View

问题输出文本文件

Problem Text file

我希望如何显示文本文件

Goal

4 个答案:

答案 0 :(得分:1)

你应该迭代列表视图项,将每个子项彼此连接起来,然后在最后将连接的字符串添加到文本文件中...我已经调整了你的代码:

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

答案 1 :(得分:1)

如何

flex

答案 2 :(得分:1)

看来你的第一个单元&#34; FirstPage&#34;是父项,所有其他项是子项。假设你只有两列,那么答案就可以了。

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 :(得分:1)

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

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<ListViewItem.ListViewSubItem>().Take(2)