[C#] Index was outside the bounds of the array.

0

Witam, od paru dni głowię się nad pewnym problemem, a z racji mojej małej biegłości w posługiwaniu się C# stoję w dołku i głupio gapię się na padający na mnie deszcz.

"Stworzyłem" prostą aplikację w VS10 korzystającą z komponentu WMP - do tego dodałem guzik, który pozwala załadować jedną lub więcej mptrójek do 'listy odtwarzania' na którą składa się listbox; następnie po kliknięciu na pozycję w listboxie odtwarza się ona w wmp. Wszystko działa fajnie, do czasu gdy do już istniejących piosenek na liście chcę dodać nowe - owszem, pojawiają się one na niej, ale gdy klikam w którąkolwiek z tych nowych to program wywala się z błędem Index was outside the bounds of the array wskazującym na linijkę z kodem: axWindowsMediaPlayer1.URL = path[listBox1.SelectedIndex]; - te, które zostały dodane w pierwszej 'turze' dalej bezproblemowo się odtwarzają.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Odtwarzacz_Mp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {

        }

        private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
        {

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

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

     
    }
} 

Na początku myślałem, że jest to wina samego dodawania do listy, dlatego kombinowałem ze zmienną i, aby nie resetowała się ona przy kolejnym dodawaniu, wtedy jednak pojawił się inny problem: gdy w pierwszej turze dodałem 3 pliki to w drugiej musiałem dodać minimum 4, aby ten 4 pojawił się na liście - początkowe były obcinane. Co ciekawsze, ten 4 dodany plik normalnie został odtworzony i powyższy błąd się nie pojawił.

Przeszukałem już wiele stron starając się znaleźć błędy powiązane z Index was outside bla bla, ale nic mi to nie pomogło, dlatego też zwracam się z prośbą w tym miejscu. Mam nadzieję, że znajdzie się ktoś kto mnie oświeci i wyprowadzi z tej ciemności niewiedzy.

Pozdrawiam.

1

Trop był dobry, problem tkwi w dodawaniu ścieżek do tablicy. Bo zamiast je dodawać nadpisywałeś tablicę(path = openFileDialog1.FileNames; - np na początku miałeś 5 elementów w tablicy path, potem dodałeś 10 do lisboxa, ale path zastąpiłeś tablicą 10-cio elementową, w ten sposób w listboxie masz 15 elementów, w tablicy - 10). I w instrukcji path[listBox1.SelectedIndex] szukałeś w tablicy indeksu, którego nie było.
Do przechowywania ścieżek zamiast tablicy stringów użyj List<string>. Wtedy dodajesz:

List<string> pliki = new List<string>();
pliki.AddRange(openafiledialog.FileNames); 

A pobierasz jak ze zwykłej tablicy. Zrób to samo z tablicą path i to powinno być ok.
PS: lisbox.items tez ma metode AddRange więc nie musisz latac w pętli po itemach

0

Zatem to tutaj tkwił błąd.. Nie wpadłbym na to, dziękuję za pomoc.
Jednakże, pojawił się teraz inny problem, przerobiłem część kodu, aby operować na listach i myślę, że to powinno działać - kod prezentuje się następująco:

List<string> pliki = new List<string>();
pliki.AddRange(openFileDialog1.SafeFileNames);
List<string> path = new List<string>();
path.AddRange(openFileDialog1.FileNames);        
foreach (string plik in pliki)
{
 listBox1.Items.Add(plik);            
} 

Ale nie jestem wstanie tego sprawdzić, ponieważ nie wiem jak odwołać się do tej listy i zmodyfikować linijkę odpowiadającą za dodanie zaznaczonej pozycji do odtwarzacza: axWindowsMediaPlayer1.URL = path[listBox1.SelectedIndex]; . Sprawdzałem w komendach powiązanych z list, ale nie wiem, której z nich użyć i w jaki sposób to zrobić.

Edit:

Po paru zmianach mój kod wygląda w tej chwili tak:

         List<string> pliki = new List<string>();
        List<string> path = new List<string>();
        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
               
                
                pliki.AddRange(openFileDialog1.SafeFileNames);
                path.AddRange(openFileDialog1.FileNames);        
                foreach (string plik in pliki)
                {
                    listBox1.Items.Add(plik);            
                }
            }
        }

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

        }

Jednak, dalej pojawia się ten sam błąd, po dodaniu nowej grupy piosenek, a dodatkowo do listboxa dopisywane są wszystkie pozycje, nie tylko te nowe (choć z tym raczej wiem, jak sobie poradzić - może czyszcząc listboxa przed dodawaniem? Tylko jak to zrobić). Dziękuję z góry za wszelką pomoc.

Edit 2:

Już teraz działa, wstawienie listBox1.Items.Clear(); przed pętlą zaradziło wszelkim problemom i teraz działa tak jak powinno.
Wielkie dzięki adams85 za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1