将文本文件读取到全局ListBox数组中实现点歌台功能
解决点歌台文本文件读取到ListBox数组的问题
嘿,我来帮你搞定这个点歌台的文本读取问题!首先咱们先明确你的文本文件结构(我帮你补全了完整的格式逻辑):
文本文件格式说明:
5 // 第一行是流派总数量
6 // 第二行是第一个流派的曲目总数
流派标题1 // 第三行是第一个流派的名称
曲目名称1 // 第四行开始是该流派的曲目,共6首
曲目名称2
...
3 // 第6+3=9行是第二个流派的曲目总数
流派标题2 // 第十行是第二个流派的名称
曲目名称1 // 接下来3行是该流派的曲目
...
(以此类推,直到读完5个流派)
接下来咱们一步步实现这个功能:
1. 全局ListBox数组声明
首先先在类的全局范围声明你的ListBox数组,这样整个类都能访问:
// 全局声明ListBox数组,存储每个流派的曲目列表 private ListBox[] genreListBoxes;
2. 核心读取逻辑代码
我写了一个完整的读取方法,包含异常处理,你可以直接调用这个方法(传入你的文本文件路径就行):
private void LoadSongsFromFile(string filePath) { try { // 使用using自动释放StreamReader资源 using (StreamReader sr = new StreamReader(filePath)) { // 读取第一行的流派数量,注意要去掉注释和空格 string genreCountLine = sr.ReadLine().Split('//')[0].Trim(); int genreCount = int.Parse(genreCountLine); // 根据流派数量初始化全局数组 genreListBoxes = new ListBox[genreCount]; // 遍历每个流派,逐个读取数据 for (int genreIndex = 0; genreIndex < genreCount; genreIndex++) { // 初始化当前流派的ListBox控件 genreListBoxes[genreIndex] = new ListBox(); // 读取当前流派的曲目数量,同样去掉注释 string trackCountLine = sr.ReadLine().Split('//')[0].Trim(); int trackCount = int.Parse(trackCountLine); // 读取流派标题 string genreTitle = sr.ReadLine().Trim(); // 把流派标题作为ListBox的第一项,加个标识方便区分 genreListBoxes[genreIndex].Items.Add($"▶ {genreTitle}"); // 读取该流派的所有曲目 for (int trackIndex = 0; trackIndex < trackCount; trackIndex++) { string trackName = sr.ReadLine().Trim(); genreListBoxes[genreIndex].Items.Add(trackName); } } // 可选:把生成的ListBox添加到窗体上(这里以WinForms为例) int startX = 20; foreach (var listBox in genreListBoxes) { listBox.Width = 220; listBox.Height = 350; listBox.Location = new Point(startX, 20); listBox.Font = new Font("微软雅黑", 9); // 给流派标题那行设置加粗样式(需要开启自定义绘制) listBox.DrawMode = DrawMode.OwnerDrawFixed; listBox.DrawItem += (sender, e) => { e.DrawBackground(); if (e.Index == 0) { // 第一行(流派标题)加粗显示 using (Font boldFont = new Font(listBox.Font, FontStyle.Bold)) { e.Graphics.DrawString(listBox.Items[e.Index].ToString(), boldFont, Brushes.DarkBlue, e.Bounds); } } else { e.Graphics.DrawString(listBox.Items[e.Index].ToString(), listBox.Font, Brushes.Black, e.Bounds); } e.DrawFocusRectangle(); }; this.Controls.Add(listBox); startX += 240; // 每个ListBox之间留20px间距 } } } catch (FileNotFoundException) { MessageBox.Show("找不到指定的歌曲文件,请检查路径!"); } catch (FormatException) { MessageBox.Show("文件格式错误,请检查每行的数字是否正确!"); } catch (Exception ex) { MessageBox.Show($"读取文件时发生错误:{ex.Message}"); } }
3. 关键注意事项
- 文本格式校验:确保你的文本文件每行数据正确,注释要放在
//后面,读取时会自动拆分掉注释内容;如果有空行,可以在读取时判断string.IsNullOrWhiteSpace(line)并跳过该行 - 异常处理:代码里已经处理了常见的异常(文件不存在、格式错误等),避免程序崩溃
- UI优化:我给ListBox加了自定义绘制,让流派标题加粗显示,用户体验更好;你也可以根据自己的需求调整控件的大小、位置和样式
内容的提问来源于stack exchange,提问作者Darren Smith
相关产品推荐
相关产品推荐

