索引不在数组中?MP3

本文关键字:MP3 数组 索引 | 更新日期: 2023-09-27 18:03:11

我有一个MP3播放器,它是这样的:

http://tinypic.com/view.php?pic=mkvzly& s = 8 # .U3My1_l_uEo

我可以毫无问题地使用这些按钮,它们工作得很好。当我想要播放歌曲时,问题就来了。如果我添加1首歌曲到列表框,双击它,它正在播放!太棒了?是的,除了如果我添加另一首歌曲,第一首歌仍然可以点击并播放,但一旦我点击第一首歌以外的任何其他歌曲,它就会崩溃。

我得到以下错误:

Listbox index out of array

下面是包含错误的代码:

string[] files, paths;
private void lbplaylist_DoubleMouseClick(object sender, EventArgs e) // Start på event
{
    player.URL = paths[lbplaylist.SelectedIndex];
}

请帮助。完整的代码和建议实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WORKS_EKSAMENSPROJEKT
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string[] files, paths;
        private void lbplaylist_DoubleMouseClick(object sender, EventArgs e) // Start på event
        {
            if (lbplaylist.SelectedItem != null)
                player.URL = (lbplaylist.SelectedItem as Song).Path;
        }
        private void btOpenFiles_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            openFileDialog1.Filter = ("MP3 Files| *.mp3|Wave Files| *.wav|WMA Files|*.wma|All Files|*.*");
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                files = openFileDialog1.SafeFileNames;
                paths = openFileDialog1.FileNames; 
                for (int i = 0; i < files.Length; i++)
                {
                    lbplaylist.Items.Add(files[i]);
                }
            }
        }
        private void btReset_Click(object sender, EventArgs e)
        {
            lbplaylist.Items.Clear();
        }
        public class Song
        {
            public string Title;
            public string Path;
            public override string ToString()
            {
                return Title;
            }
            public override int GetHashCode()
            {
                return ToString().GetHashCode();
            }
            public override bool Equals(object obj)
            {
                if (obj is Song)
                    return this.Path.Equals(((Song)obj).Path);
                else
                    return base.Equals(obj);
            }
        }
    }
}

索引不在数组中?MP3

这个错误最明显的原因是paths没有第二个条目。问题是为什么。如果在播放列表中添加了另一首歌曲,则需要确保在paths中也添加了一个新条目。

这样做可能是个好主意:

  1. 创建一个新的助手类Song,其中包含MP3文件的标题和路径。重写它的ToString()方法来返回歌曲标题。
  2. 当添加一首新歌到播放列表时,创建一个新的Song实例,并将其添加到列表框中。
  3. 当双击一个条目时,从所选Song对象的路径播放文件,而不是代码中的另一个列表。

这样你只需要维护一个列表。

的例子:

public class Song
{
    public string Title;
    public string Path;
    public override string ToString()
    {
        return Title;
    }
    public override int GetHashCode()
    {
        return ToString().GetHashCode();
    }
    public override bool Equals(object obj)
    {
        if (obj is Song)
            return this.Path.Equals(((Song)obj).Path);
        else
            return base.Equals(obj);
    }
}

然后双击列表项的代码变为:

private void lbplaylist_DoubleMouseClick(object sender, EventArgs e) // Start på event
{
    if (lbplayList.SelectedItem != null)
        player.URL = (lbplayList.SelectedItem as Song).Path;
}

添加一个新文件到播放列表,你可以这样做:

Song s = new Song() { Title = title, Path = filePath };
lbplayList.Items.Add(s);

请注意filePath应该包含MP3文件的完整路径(路径+名称)。


要正确地将Song项目添加到播放列表中,请使用以下命令:

private void btOpenFiles_Click(object sender, EventArgs e)
{
    OpenFileDialog open = new OpenFileDialog();
    openFileDialog1.Filter = ("MP3 Files|*.mp3|Wave Files|*.wav|WMA Files|*.wma|All Files|*.*");
    if (openFileDialog1.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
    {
        foreach (string file in openFileDialog1.FileNames)
        {
            Song s = new Song() { Title = Path.GetFileNameWithoutExtension(file), Path = file };
            lbplaylist.Items.Add(s);
        }
    }
}

同样,现在很明显为什么会出现错误!每次点击btnOpenFiles,设置paths只包含最后选择的文件名。因此,如果您在第一次单击时选择了一个文件,在第二次单击时选择了另一个文件,则列表框将包含两个条目,但paths将只包含最后一个选择。