Dodanie nowych wartości do listbox i pozostawienie starych

0

Witam
Problem 1. Mam taki problem wrzucam na listbox pliki za pomoca openfiledialog. I tak teraz kiedy zaznacze kilka plików i je wrzuce mogę bez problemu odtwarzać, każdy utwór (i tak mam pod sobią np . moby, metalica, niemen...), problem pojawia się gdy chcę później dorzucić kilka plików to wtedy dopisuje mi na miejsce tego pierwszego na (listbox czyli w tym przykładzi wyżej do moby) śceiżkę z wybranego pliku np. timbeland i gdy klikam na moby odtwarza mi plik timbeland zamiast moby, natomiast inne pliki kiedy na nie kliknę wywalają mi błąd. Jak porpostu dopisywać to do już istniejących plików a nie zastępować je. Jak (+=)??

string[] files, paths;
 
 
  private void button11_Click_2(object sender, EventArgs e)
        {

           
          
            
           
            if (openFileDialog3.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
               
                
                files = openFileDialog3.SafeFileNames; //  Save only the names
                paths = openFileDialog3.FileNames; // Save the full paths 

                
               
                for (int i = 0; i < files.Length; i++)
                {
                   listBox1.Items.Add(files[i]); // Add songs to the listbox 
                 
                  
                }



          
            }
        }
  private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
        {
           
            //axWindowsMediaPlayer1.Ctlcontrols.stop();
            //paths[listBox1.SelectedIndex] += paths[listBox1.SelectedIndex];
            axWindowsMediaPlayer1.URL = paths[listBox1.SelectedIndex]; // Play the song 
           
            axWindowsMediaPlayer1.Ctlcontrols.play();
    
        }
 

Problem 2. W jaki sposób usuwać zaznaczony utwór z listbox.
Problem 3. Jak zapisać tą listę, żeby po ponownym uruchomieniu była widoczna w listbox i miała przypisane odpowiednio ścieżki? Czy lepiej użyć do tego listy. Sam zapis wiem jak zrobić chodzi mi o to , jak to zrobić żeby pamiętało dla konkretnego utworu jego ścieżkę. Pliki mogą być na różnych dyskach.

0
  1. Nie wiem dokładnie o co ci chodzi, kod wydaje się być dobry i nie powinno się nic nadpisywać.
  2. http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.objectcollection.aspx
  3. Może użyj Dictionary<string, string>, gdzie klucz to tytuł, a wartość to ścieżka, a potem to zserializuj.

Jeszcze co do problemu I, coś pewnie z tablicami jest nie tak, lepiej użyj listy albo słownika.

0

Hmm... a do pierwszego problemu mogę użyć listy?

0

Nawet powinieneś.

0

hmmm... no nie wiem przy użyciu list to samo mi wychodzi ... :/ Może kotś ma pomysł w jaki sposób mogę stworzyć swoją "wizualną" playlistę - w miarę prosty sposób, ewentualnie korzystając z gotowych metod axwindowsmediaplayer. Chodzi mi o taką listę, jak np. w winampie - dodaję pliki do listy i mogę sobie później ją zapisać.

0

Najbardziej mnie zastanawia, takie coś:

  • klikam button1 - dodaję 3 piosenki naraz - wszystko działa tak jak trzeba
  • klikam drugi raz button1 dodaję jedną piosenkę - i teraz na listbox mam juz 4 piosenki, ale sciezka do tej 4 piosenki jest podpieta pod pierwszy utwor i gdy kliknę w pierwszy to dziala, a jak w któryś z pozostałych to wyskakuje błąd ... :/ - czemu?
0

No cóż, bo źle to robisz.
Zauważ, że w metodzie, która obsługuje zdarzenie kliknięcia na listę korzystasz z tablicy paths. Zawartość tej zmiennej nadpisujesz po kliknięciu w button1 i wybraniu plików. Powinieneś dopisywać do tej tablicy kolejne ścieżki, a nie nadpisywać tą zmienną. Zresztą i tak jest źle, bo powinieneś konkretną nazwę z konkretną ścieżką wiązać.

0

Czyli np. użyć?

Dictionary<string[], string[]> ListaSciezkaUtwor2 = new Dictionary<string[], string[]>();
string[] paths, files;



1. Czy tutaj będzie mi dopisywać do słownika czy nadpisywać? Podejrzewam, że nadpisywać, w takim razie jak zrobić żeby dopisywać.
 private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            files = openFileDialog1.SafeFileNames; // Save only the names 
            paths = openFileDialog1.FileNames; // Save the full paths
            ListaSciezkaUtwor2.Add(files, paths);  
     }
2. W jaki sposób wyświetlić te pliki w listbox?
    Takie coś nie działa.

listBox1.Items.Add(ListaSciezkaUtwor[files]);


3. Jak powiązać ten słownik, żeby po kliknięciu w wybrany utwor na listbox odtwarzał się ten co trzeba. Tak jak to miałem przy tablicy stringów - Całość na górze tematu w pierwszym poście:

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

    }
Później oczywiście tka jak to bylo powiedziane możnaby to zserializować i wczytyweać odrazu tą listę. No, ale pozostaje taki problem opisany wyżej.... No chyba, że tak jak mówie mogę w jakiś sposób prosty uzyć do tworzenia listy **"IWMPPlaylistCollection"**. Naprowadzcie proszę na dobry tok myslenia... :/
0

Dlaczego na siłę próbujesz skorzystać z tych tablic? Skoro już masz tego swojego ListBoxa, to możesz do niego pakować cokolwiek. Wystarczy zadbać o to, żeby pozycje w liście były jakoś sensownie wyświetlane. Stwórz sobie jakąś klasę albo weź jakichś gotowy kontener, który będzie ci odpowiadał i pakuj instancje takiego obiektu do listy.

0

Czyli najlepiej zrobić klasę, której konstruktor będzie pobierał i nazwę i ścieżke i wiązał je z sobą np. przy użyciu dictionary? I dopiero dodawać to do listboxa?

0

To znowu ja :)
Zrobiłem sobie klasę

 
 class PlayLista
    {
        public int NumerId { get; private set; }
        public string NazwaUtworu { get; private set; }
        public string SciezkaUtworu { get; private set; }

        public PlayLista(int iNumerId, string sNazwaUtworu, string sSciezkaUtworu)

        {
            NumerId = iNumerId;
            NazwaUtworu = sNazwaUtworu;
            SciezkaUtworu = sSciezkaUtworu;
        }

    }

I teraz tak:

  List<PlayLista> ListaUtworow = new List<PlayLista>();
 
         openFileDialog1.Multiselect = true;
 
 
 private void button1_Click(object sender, EventArgs e)
        {

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
               

                sciezka =openFileDialog1.FileName;
                nazwa = openFileDialog1.SafeFileName;
                ListaUtworow.Add(new PlayLista(id,nazwa, sciezka));
       
                int nListaUtworow = ListaUtworow.Count;
                for (int nCounter = 0; nCounter < nListaUtworow; ++nCounter)
                {
                    PlayLista nLista= ListaUtworow[nCounter];       
                    listBox1.Items.Add(nLista.NumerId + nLista.NazwaUtworu);
                }
                
  1. W jaki sposób zrobić, żeby dodawało mi kilka zaznaczonych plików naraz? Multiselect dla open filedialog1 jest utawione na true. Tak jak to robiłem przy użyciu tablić string[] files, paths.
    Takei coś odpada chyba?: A jeśli moze być to jak to wyświetlić później na listbox1.
     public int NumerId[] { get; private set; }
        public string[] NazwaUtworu { get; private set; }
        public string[] SciezkaUtworu { get; private set; }

        public PlayLista(int[] iNumerId, string[] sNazwaUtworu, string[] sSciezkaUtworu) 
  1. W jaki sposób czyścić listBox1. Bo teraz za każdym razem dodaje mi po wciśnięciu klawisza, wszystkie pozycje (czyli te co były plus te co wybrałem teraz), a ja chciałbym, aby dodawało tylko ostatnio wybrane.

  2. W jaki sposób teraz to podpiąć pod Listbox1_SelectedIndexChange: Tak jak to było zrobione dla tablic - przykłąd niżej:

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

 
  1. Czy zserializować listę, aby móc ją zapisywać, czy lepiej zapisać do jakiegoś pliku przez StreamWriter?

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