我有这个MP3播放器,如下所示:
http://tinypic.com/view.php?pic=mkvzly&s=8#.U3My1_l_uEo
我可以毫无问题地使用这些按钮,它们可以正常工作。当我想播放歌曲时,问题就出现了。如果我将1首歌曲添加到列表框中,请双击它,它正在播放!真棒?好吧,除了事实,如果我添加另一首歌,第一首歌仍然是可点击的并且正在播放,但是一旦我点击任何其他歌曲而不是第一首歌,它就会崩溃。
我收到以下错误:
列表框索引超出数组
下面是包含错误的代码:
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);
}
}
}
}
答案 0 :(得分:1)
嗯,错误的最明显原因是paths
没有第二个条目。问题是为什么。如果您在播放列表中添加另一首歌曲,则需要确保新条目也添加到paths
。
执行以下操作可能是个好主意:
Song
的新助手类,其中包含标题和MP3文件的路径。覆盖其ToString()
方法以返回歌曲标题。Song
的新实例,然后将其添加到列表框中。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
将仅包含最后一个选项。