You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将文本文件读取到全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:25:16