索引不在数组中?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);
}
}
}
}
这个错误最明显的原因是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
将只包含最后一个选择。