如何修复此IndexOutOfBoundsException

时间:2012-09-08 14:36:05

标签: c#

我的程序运行正常,但有一点问题。当我将新曲目以前存在的文件添加到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];
    }
}

4 个答案:

答案 0 :(得分:3)

Adil找到了问题的原因,但有一个更清洁的解决方案:

foreach (string file in files)
{
    listBox1.Items.Add(file);
}

......甚至更好:

listBox1.Items.AddRange(files);

事实上,我会更进一步,完全摆脱实例变量filespaths。我要么使用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]; 
}