Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将listview中的第一列和第二列行写入文本文件中的每一行_C#_.net_Winforms_Listview_Text Files - Fatal编程技术网

C# 将listview中的第一列和第二列行写入文本文件中的每一行

C# 将listview中的第一列和第二列行写入文本文件中的每一行,c#,.net,winforms,listview,text-files,C#,.net,Winforms,Listview,Text Files,我正在使用WinForms。在我的表单中,我有一个列表视图和一个按钮。当我点击按钮时,程序将列表视图中的所有项目写入文本文件。问题是我希望第一列和第二列在一行中 以下是迄今为止我用来写入文本文件的代码: using (StreamWriter sw = File.CreateText(DirectoryPath)) { foreach (ListViewItem item in listView1.Items)

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

以下是迄今为止我用来写入文本文件的代码:

            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);
                    }
                }
             }
使用(StreamWriter sw=File.CreateText(DirectoryPath))
{
foreach(listView1.Items中的ListViewItem项)
{
软件编写线(项目文本);
对于(int i=1;i
我的列表视图

问题输出文本文件

我希望文本文件的显示方式


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

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);
    }
 }
使用(StreamWriter sw=File.CreateText(DirectoryPath))
{
foreach(listView1.Items中的ListViewItem项)
{
字符串strText=“”;
//我不知道为什么从1开始,而不是从0开始:
对于(int i=1;i
就这样怎么样

       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);
                }
            }
         }
使用(StreamWriter sw=File.CreateText(DirectoryPath))
{
foreach(listView1.Items中的ListViewItem项)
{
sw.Write(item.Text+“:”);
对于(int i=1;i
您的第一个单元格“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);
                    }
                }
            }
        }
等等。您可以迭代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);
            }
        }
    }
使用(StreamWriter sw=File.CreateText(DirectoryPath))
{
foreach(listView1.Items中的ListViewItem项)
{
Write(string.Format(“{0}:”,item.Text));
对于(int i=1;i

您可以用更优雅的方式:

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);
var str=listView1.Items.Cast()
.Select(x=>x.SubItems.Cast())
.Select(x=>string.Join(“:”,x.Select(s=>s.Text));
System.IO.File.writeAllines(@“d:\File.txt”,str);

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

我认为代码中的行需要更正strText+=“”+sw.WriteLine(item.SubItems[I].Text);实际上应该是strText+=“”+项。子项[i]。文本;您可以只使用sw.Write(Item.Text)而不使用WriteLine,这样在写入项的文本后,行就不会终止。我喜欢LINQ,但有时它所做的主要事情就是模糊代码的作用。@AgapwIesu代码是这样工作的:
Cast()
将可枚举集合转换为
IEnumerable
,因此我们可以对其使用linq方法。所以我们得到了第一行的项目列表。然后在第二行中,我们选择了一个项目的所有子项目,因此结果是一个列表,其中每个元素包含一个项目的子项目列表。然后在第三行中,我们从所有子项中选择文本,并使用
string.Join
,使用“:”作为分隔符连接这些子项。@AgapwIesu Practice使其完美。当您充分使用它时,您将读取与读取for循环一样简单的行,并学习解析它,您将看到它是用于这种情况的最佳解决方案之一。
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);