指数数组的边界之外

时间:2014-05-30 00:26:30

标签: c#

我使用以下代码得到“索引超出数组范围”错误。音乐停止后我会尝试点击另一首歌。我该如何解决这个问题?

private void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        files = openFileDialog1.SafeFileNames;
        paths = openFileDialog1.FileNames;
        for (int i = 0; i < files.Length; i++)
        {
            listBox1.Items.Add(files[i]);
        }
    }
}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    axWindowsMediaPlayer1.URL = paths[listBox1.SelectedIndex];
}

3 个答案:

答案 0 :(得分:1)

选择新文件时,您不会从ListBox清除旧项目。在添加新项目之前,请使用Clear方法删除旧项目。

您所描述的错误是因为ListBox中的项目数多于paths变量中的项目数。

这将是您的新代码:

private void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        files = openFileDialog1.SafeFileNames;
        paths = openFileDialog1.FileNames;
        listBox1.Items.Clear(); // added this line
        for (int i = 0; i < files.Length; i++)
        {
            listBox1.Items.Add(files[i]);
        }
    }
}

答案 1 :(得分:0)

您需要使用列表框的DisplayMemberValueMember,并绑定到Tuple<string,string>的集合。

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string path=listBox1.SelectedValue as string;
        // return the path of the item
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog()==DialogResult.OK)
        {
            var files=openFileDialog1.FileNames;
            var paths=openFileDialog1.SafeFileNames;
            var items=new List<Tuple<string, string>>();
            if (paths.Length!=files.Length) throw new IndexOutOfRangeException();
            for (int i=0; i<files.Length; i++)
            {
                items.Add(
                    new Tuple<string, string>(files[i],paths[i])
                    );
            }

            listBox1.DataSource=items;
            listBox1.DisplayMember="Item1";
            listBox1.ValueMember="Item2";
        }


    }

答案 2 :(得分:0)

尝试

axWindowsMediaPlayer1.URL = paths[listBox1.FocusedItem.Index];

代替

我不确定,但是在你玩之前,你似乎专注于这个项目?如果是,请尝试上面的代码。 Spooky上面也提出了一个很好的观点。他的建议可能也会奏效。 在添加新文件之前尝试清除列表视图。

listBox1.Items.Clear();