【问题标题】:How to fix this IndexOutOfBoundsException如何修复此 IndexOutOfBoundsException
【发布时间】:2012-09-08 14:36:05
【问题描述】:

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

【问题讨论】:

  • 欢迎,丽达!请do some research 并使用调试器缩小问题范围,然后制定一个更精确的问题(如How to Ask 所示),只包含相关代码。谢谢。

标签: c#


【解决方案1】:

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

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

...甚至更好:

listBox1.Items.AddRange(files);

事实上,我会更进一步,完全摆脱实例变量files 和paths。我要么使用Tuple&lt;string, string&gt;,要么为文件/类对创建一个类。然后,您可以将每个添加到 @987654326 @中,设置 @987654327 @,以便显示 @987654328 @part part显示,但是当更改所选索引时,请获取 path path path path 来自所选项目。那么就完全没有必要搞乱索引了。

【讨论】:

  • @radbyx:您将为SafeFileNames 和FileNames 中的每个项目添加Tuple&lt;string, string&gt;。这可能是使用Zip LINQ 操作完成的最简单的操作。
  • @Rida:那你需要提供更多信息。你甚至没有说异常是在哪里引发的。
【解决方案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 基于 cmets 编辑

您可能会通过单击 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]);
         }
      }          
}

如果您想保留之前的选择,请使用列表而不是数组,因为列表比数组更容易增长。

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]);
         }
     }          
}

【讨论】:

  • 它不适用于 (int i = 0; i
  • 您刚刚声明了数组的引用,但没有为元素分配空间。我刚刚更新了我的答案。
  • @Index 超出了数组的界限,我是 c# 的新 prgramer,而这个 prgm 让我很生气,实际上我从 moarning 和 itz 晚上开始尝试解决这个问题,但仍然坚持这个跨度>
  • 您的代码运行良好。我认为异常即将到来,因为 axWindowsMediaPlayer1 为空。更改 axWindowsMediaPlayer1.URL = paths[listBox1.SelectedIndex];到 MessageBox.Show(path[listBox1.SelectedIndex]);
  • 我发现只有一种可能性会产生 indexoutofbound 异常。当我们在列表框中多次添加文件时,请多次单击按钮1。您可以通过在属性窗口或代码中将 MultiSelect 属性设置为 true 从 openFileDialog 中选择多个文件。摆脱异常的一种方法是在每次单击按钮时清除列表框。把 listBox1.Items.Clear();作为 private void button1_Click(object sender, EventArgs e){ listBox1.Items.Clear(); 中的第一条语句
【解决方案3】:

我认为问题不在于向数组中添加项目。更可能的原因是 SelectedIndexChanged 事件处理程序。您应该检查 SelectedIndex 以确保它有效。

int idx = listBox1.SelectedIndex;
if (paths != null && idx > 0 && idx < paths.Length)
{
    axWindowsMediaPlayer1.URL = paths[idx]; 
}

【讨论】:

  • 这直接回答了这个问题,但我同意 Sheet 的答案是一个更清洁的解决方案。根本不要使用数组。传递列表框项中的名称和路径。
【解决方案4】:

我认为 Jon 和 Adil 都是绝对正确的,您绝对可以使用他们的代码来解决部分问题。但是,我的猜测是paths 中没有任何元素,因此当您尝试从中获取元素时,它会抛出异常。可以试试下面的代码吗:

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

看看你是否仍然抛出异常,如果没有,那么你还有另一个问题,为什么你的 paths 变量没有被设置,或者为什么列表框选择的索引大于变量中的元素。

【讨论】:

  • 能否请您调试应用程序并查看引发异常的确切位置?要调试,请在这两行文件上放置断点= openFileDialog1.SafeFileNames;文件 = openFileDialog1.SafeFileNames;然后你可以单步抛出代码,一旦你知道你在哪里抛出异常,你可以再次在这里发布你的结果
  • axWindowsMediaPlayer1.URL = 路径[listBox1.SelectedIndex];这里出错了
  • 下一个问题,paths.Length 是什么,listBox1.SelectedIndex 的值是多少?当您在“if (paths.Length >= listBox1.SelectedIndex)”行上放置断点时,您应该能够通过将鼠标悬停在它们上看到这一点
  • 当我将鼠标悬停在 paths.Length 上时,它显示 int array.length 获取代表 system.array 所有维度中元素总数的 32 位整数。当我将鼠标悬停在 listBox1.SelectedIndex 上时,它会显示 int listbox.selectedindex 设置或获取 system.windows.form1.listbox1 异常 System.ArgumentOutOfRange 异常 System.ArgumentException 中当前选定项目的从零开始的索引
  • 尝试 ?paths.Length 然后在即时窗口中尝试 ?listBox1.SelectedIndex 并再次发布结果
猜你喜欢
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2018-02-13
  • 2022-01-11
  • 2010-12-22
  • 2011-12-30
相关资源
最近更新 更多