我的程序运行正常,但有一点问题。当我将新曲目以前存在的文件添加到ListBox时,程序会遇到错误。代码似乎不愿意在一个新文件中循环,该文件是在不同的时间添加的。请帮我。谢谢......
public partial class Form1 : Form
{
//...
string[] files, paths;
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
files = openFileDialog1.SafeFileNames;
paths = openFileDialog1.FileNames;
for (int i = 0; i < files.Length - 1; i++)
{
listBox1.Items.Add(files[i]);
}
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
axWindowsMediaPlayer1.URL = paths[listBox1.SelectedIndex];
}
}
答案 0 :(得分:3)
Adil找到了问题的原因,但有一个更清洁的解决方案:
foreach (string file in files)
{
listBox1.Items.Add(file);
}
......甚至更好:
listBox1.Items.AddRange(files);
事实上,我会更进一步,完全摆脱实例变量files
和paths
。我要么使用Tuple<string, string>
,要么为文件/类对创建一个类。然后,您可以将每个完整数据项添加到listBox1.Items
,设置DisplayMember
以便显示file
部分,但是当更改所选索引时,请获取所选项目中的路径。然后根本不需要乱用索引。
答案 1 :(得分:2)
您添加的文件少于存在的文件,当您访问最后一个
时更改
for (int i = 0; i < files.Length - 1; i++)
{
listBox1.Items.Add(files[i]);
}
要
for (int i = 0; i < files.Length; i++)
{
listBox1.Items.Add(files[i]);
}
根据OP的评论进行编辑
您可能只需点击button1,就可以在列表框中添加一次以上的文件。这将在列表框中添加新文件,但是数组将丢失数组中的先前项目,并且数组中的计数将变得小于列表框中的项目。
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear(); //Clear the items of list box to keep the same items in both listbox and in array paths.
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
files = openFileDialog1.SafeFileNames;
paths = openFileDialog1.FileNames;
for (int i = 0; i < files.Length ; i++)
{
listBox1.Items.Add(files[i]);
}
}
}
如果你想保留以前的选择,那么使用list而不是数组,因为list可以比数组更容易增长。
string[] files;
List<string> paths = new List<string>() ;
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
files = openFileDialog1.SafeFileNames;
paths.AddRange(openFileDialog1.FileNames.ToList());
for (int i = 0; i < files.Length; i++)
{
listBox1.Items.Add(files[i]);
}
}
}
答案 2 :(得分:1)
我认为Jon和Adil都是绝对正确的,你绝对可以使用他们的代码来解决部分问题。但是,我的猜测是你在paths
中没有任何元素,所以当你试图从中获取一个元素时,它会抛出异常。您可以尝试以下代码:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (paths.Length >= listBox1.SelectedIndex)
axWindowsMediaPlayer1.URL = paths[listBox1.SelectedIndex];
}
看看你是否仍然被抛出异常,如果没有,那么你还有另外一个问题:为什么你的paths
变量没有被设置,或者为什么列表框选择的索引大于变量中的元素。
答案 3 :(得分:1)
我认为问题不在于向数组中添加项目。更可能的原因是SelectedIndexChanged事件处理程序。您应该检查SelectedIndex以确保它是有效的。
int idx = listBox1.SelectedIndex;
if (paths != null && idx > 0 && idx < paths.Length)
{
axWindowsMediaPlayer1.URL = paths[idx];
}