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