将文本文件中的多个项目加载到 ListView C#
Loading multiple items from a text file to a ListView C#
我正在使用带有 visual studio 的 windows 表单应用程序创建购物篮表单,我有一个包含一些产品的文本文件,当用户选择加载时,我想读取该文件,然后然后将数据放入 ListView 但它只执行第一项。
这是我目前的代码和我的结果:
private void LoadOrder_Click(object sender, EventArgs e)
{
Stream myStream = null;
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
try
{
if ((myStream = theDialog.OpenFile()) != null)
{
using (myStream)
{
System.IO.StreamReader sr = new System.IO.StreamReader(myStream);
string fileContent = sr.ReadToEnd();
string[] fileItems = fileContent.Split('|');
sr.Dispose();
ListViewItem lv = new ListViewItem();
lv.Text = fileItems[0].ToString();
lv.SubItems.Add(fileItems[1].ToString());
lv.SubItems.Add(fileItems[2].ToString());
basket.Items.Add(lv);
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
}
文本文件:
Banana|6|0.25
Steak|2|1.75
Chips|1|3
Sweets|6|1.5
加载后的列表视图:
如果有人能帮助我或指出正确的方向,我将不胜感激,谢谢!
在您的代码中,您正在读取文件内容并将其拆分为 |
个字符。那将 return 你的字符串数组看起来像这样:
[0]Banana
[1]6
[2]0.25
[3]Steak
[4]2
[5]1.75
等
由于你的数据比较少,我建议你使用 File.ReadAllLines
然后分割每一行。像这样:
if (theDialog.ShowDialog() == DialogResult.OK)
{
var lines = File.ReadAllLines(theDialog.FileName);
foreach (string line in lines)
{
string[] fileItems = line.Split('|');
ListViewItem lv = new ListViewItem();
lv.Text = fileItems[0].ToString();
lv.SubItems.Add(fileItems[1].ToString());
lv.SubItems.Add(fileItems[2].ToString());
basket.Items.Add(lv);
}
}
您在此处所做的如下:
- 您读取了整个文件并将其加载到内存中
- 您将大字符串拆分为一个数组
- 您仅使用该数组的前三项创建并添加了
ListViewItem
。
前三项的最后一个操作仅执行一次。
为了获得您想要的结果,您需要循环执行最后一个操作。这样所有的数据都会被解析。当你这样做时,最好也循环读取文件,而不是将其全部加载到内存中。
使用这个:
if ((myStream = theDialog.OpenFile()) != null)
{
using (myStream)
{
using (var sr = new System.IO.StreamReader(myStream)) // Wrapped it up in a using statement so it is disposed of automagically
{
string line = string.Empty;
while ((line = sr.ReadLine()) != null) // Loop while there is more data to read
{
string[] lineItems = line.Split('|'); // Split only the single line
ListViewItem lv = new ListViewItem();
lv.Text = lineItems[0];
lv.SubItems.Add(lineItems[1]);
lv.SubItems.Add(lineItems[2]);
basket.Items.Add(lv);
}
}
}
}
这里我们做的是一行一行读取,然后对每一行进行ListViewItem
的拆分和创建。请记住,这是使其工作的最基本代码。理想情况下,您应该添加验证代码(即确保每行数据对您的目的有效)。
此外,避免像 StreamReader
这样手动处理对象。相反,使用 using
语句,以确保它始终被正确处理,即使出现异常也是如此。
您需要循环 fileItems[] 数组。
你有
lv.Text = fileItems[0].ToString();
lv.SubItems.Add(fileItems[1].ToString());
lv.SubItems.Add(fileItems[2].ToString());
basket.Items.Add(lv);
需要包裹在一个循环中
我正在使用带有 visual studio 的 windows 表单应用程序创建购物篮表单,我有一个包含一些产品的文本文件,当用户选择加载时,我想读取该文件,然后然后将数据放入 ListView 但它只执行第一项。
这是我目前的代码和我的结果:
private void LoadOrder_Click(object sender, EventArgs e)
{
Stream myStream = null;
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
try
{
if ((myStream = theDialog.OpenFile()) != null)
{
using (myStream)
{
System.IO.StreamReader sr = new System.IO.StreamReader(myStream);
string fileContent = sr.ReadToEnd();
string[] fileItems = fileContent.Split('|');
sr.Dispose();
ListViewItem lv = new ListViewItem();
lv.Text = fileItems[0].ToString();
lv.SubItems.Add(fileItems[1].ToString());
lv.SubItems.Add(fileItems[2].ToString());
basket.Items.Add(lv);
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
}
文本文件:
Banana|6|0.25
Steak|2|1.75
Chips|1|3
Sweets|6|1.5
加载后的列表视图:
如果有人能帮助我或指出正确的方向,我将不胜感激,谢谢!
在您的代码中,您正在读取文件内容并将其拆分为 |
个字符。那将 return 你的字符串数组看起来像这样:
[0]Banana
[1]6
[2]0.25
[3]Steak
[4]2
[5]1.75
等
由于你的数据比较少,我建议你使用 File.ReadAllLines
然后分割每一行。像这样:
if (theDialog.ShowDialog() == DialogResult.OK)
{
var lines = File.ReadAllLines(theDialog.FileName);
foreach (string line in lines)
{
string[] fileItems = line.Split('|');
ListViewItem lv = new ListViewItem();
lv.Text = fileItems[0].ToString();
lv.SubItems.Add(fileItems[1].ToString());
lv.SubItems.Add(fileItems[2].ToString());
basket.Items.Add(lv);
}
}
您在此处所做的如下:
- 您读取了整个文件并将其加载到内存中
- 您将大字符串拆分为一个数组
- 您仅使用该数组的前三项创建并添加了
ListViewItem
。
前三项的最后一个操作仅执行一次。 为了获得您想要的结果,您需要循环执行最后一个操作。这样所有的数据都会被解析。当你这样做时,最好也循环读取文件,而不是将其全部加载到内存中。
使用这个:
if ((myStream = theDialog.OpenFile()) != null)
{
using (myStream)
{
using (var sr = new System.IO.StreamReader(myStream)) // Wrapped it up in a using statement so it is disposed of automagically
{
string line = string.Empty;
while ((line = sr.ReadLine()) != null) // Loop while there is more data to read
{
string[] lineItems = line.Split('|'); // Split only the single line
ListViewItem lv = new ListViewItem();
lv.Text = lineItems[0];
lv.SubItems.Add(lineItems[1]);
lv.SubItems.Add(lineItems[2]);
basket.Items.Add(lv);
}
}
}
}
这里我们做的是一行一行读取,然后对每一行进行ListViewItem
的拆分和创建。请记住,这是使其工作的最基本代码。理想情况下,您应该添加验证代码(即确保每行数据对您的目的有效)。
此外,避免像 StreamReader
这样手动处理对象。相反,使用 using
语句,以确保它始终被正确处理,即使出现异常也是如此。
您需要循环 fileItems[] 数组。
你有
lv.Text = fileItems[0].ToString();
lv.SubItems.Add(fileItems[1].ToString());
lv.SubItems.Add(fileItems[2].ToString());
basket.Items.Add(lv);
需要包裹在一个循环中