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

実際、私はさらに進んで、インスタンス変数filespaths完全に取り除きます。Tuple<string, string>ファイル/クラスのペアにクラスを使用するか作成します。次に、各完全なデータ項目をに追加し、パーツが表示されるようlistBox1.Itemsに設定しますが、選択したインデックスが変更された場合は、選択した項目からパスをフェッチします。そうすれば、インデックスをいじる必要はまったくありません。DisplayMemberfile

于 2012-09-08T14:40:03.100 に答える
2

ファイルが存在するよりも少ないファイルを1つ追加しています.最後のファイルにアクセスするとき

変化する

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のコメントに基づいて編集

ボタン1をクリックして、リストボックスにファイルを複数回追加している可能性があります。これにより、リストボックスに新しいファイルが追加されますが、配列は配列内の以前のアイテムを失い、配列内のカウントはリストボックス内のアイテムよりも少なくなります。

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 に答える