我正在使用带有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
加载后的ListView:
如果有人可以帮助或指出我正确的方向,我们将不胜感激,谢谢!
答案 0 :(得分:2)
您在此完成的工作如下:
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
语句,以确保它始终处于正确处理状态,即使存在异常。
答案 1 :(得分:0)
在您的代码中,您正在阅读文件内容并将其拆分为|
char。这将返回你看起来像这样的字符串数组:
[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);
}
}
答案 2 :(得分:0)
您需要循环fileItems []数组。
你有
的地方 lv.Text = fileItems[0].ToString();
lv.SubItems.Add(fileItems[1].ToString());
lv.SubItems.Add(fileItems[2].ToString());
basket.Items.Add(lv);
需要包裹在循环中