ListView仅显示CSV首行且需点击才显示的技术问题
问题解决:CSV数据无法完整显示到ListView及加载时机问题
问题1:仅显示第一行的原因
你在while循环外只创建了一个ListViewItem对象,后续循环不断给这个对象添加子项,导致所有CSV行的内容都挤到了同一个列表项里,自然只能看到第一行(实际是所有内容堆叠在一起)。
问题2:需点击才显示的原因
读取CSV的代码写在了listView1_SelectedIndexChanged事件中,这个事件只有用户点击ListView改变选中项时才触发,程序启动时不会自动执行。
修正后的代码
把读取逻辑移到窗体的Load事件,同时在循环内每次创建新的ListViewItem:
private void Form1_Load(object sender, EventArgs e) { var path = @"C:\Universitet\Privat\testfil.csv"; using (TextFieldParser csvParser = new TextFieldParser(path)) { csvParser.CommentTokens = new string[] { "#" }; csvParser.SetDelimiters(new string[] { ";" }); csvParser.HasFieldsEnclosedInQuotes = true; // 跳过表头行 csvParser.ReadLine(); while (!csvParser.EndOfData) { // 读取一行字段 string[] fields = csvParser.ReadFields(); // 每行新建一个ListViewItem,第一个字段作为主项 ListViewItem rowItem = new ListViewItem(fields[0]); // 循环添加剩余字段作为子项,替代重复的手动添加 for (int i = 1; i < fields.Length; i++) { rowItem.SubItems.Add(fields[i]); } // 将当前行添加到ListView listView1.Items.Add(rowItem); } } }
额外注意事项
- 确保ListView的
View属性设置为Details,并且已经添加了对应14个字段的列,否则子项内容会无法显示。 - 如果CSV表头需要显示为ListView的列标题,可以在读取表头行后,循环创建对应列添加到
listView1.Columns中。
内容的提问来源于stack exchange,提问作者Andreas Ravnholt
相关产品推荐
相关产品推荐

