0

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

4 回答 4

3

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

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

...甚至更好:

listBox1.Items.AddRange(files);

files事实上,我会更进一步,彻底摆脱实例变量pathsTuple<string, string>我会为文件/类对使用或创建一个类。然后您可以将每个完整的数据项添加到listBox1.Items,设置DisplayMember以便file显示部分,但是当所选索引更改时,从所选项目中获取路径。那么根本就没有必要搞乱索引。

于 2012-09-08T14:40:03.100 回答
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]);
         }
      }          
}

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

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]);
         }
     }          
}
于 2012-09-08T14:38:49.940 回答
1

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

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

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

于 2012-09-08T15:34:55.160 回答
1

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

int idx = listBox1.SelectedIndex;
if (paths != null && idx > 0 && idx < paths.Length)
{
    axWindowsMediaPlayer1.URL = paths[idx]; 
}
于 2012-09-08T15:38:15.580 回答