none
C# mit WPF: ListBox Sortierung übernehmen RRS feed

  • Frage

  • Hallo liebe Community,
    ich habe ein Problem und ich hoffe jemand hat für dieses eine Lösung.
    Programmiersprache: C# mit WPF
    Ich sortiere über den Index, per Buttons, die Elemente einer ListBox. Die ListBox wird von 
    von einer ObservableCollection befüllt. Diese bekommt ihre Objekte durch einen foreach-Loop durch ein, vom User, gewähltes Verzeichnis. Dieses Enthält Bilder mit verschiedenen Endungen.
    Nun möchte ich das die durch den User in der ListBox erzeugte Sortierung gespeichert wird. Da ich keine andere Methode kenne, außer sie alle in absteigender Reinfolge mit Nummern zu benennen. (Der orginale Dateiname ist meistens nur IMG_XXX von daher ... ) . Also, als Beispiel: Es gibt Fotos IMG_1.jpg, IMG_2.jpg und IMG_3.jpg. Der User sotiert dise dann so: IMG_2.jpg, IMG_3.jpg, IMG_1.jpg. Ich will nun das dass erste Foto, IMG_2.jpg, auch als erstes erscheint wenn man es mit z.B. Windows Foto/Fax Viewer öffnet. Also will ich es 0.jpg nennen usw. Ich habe es nun auch verschiedenen Wegen versucht allerdings endet es entweder in "Eine nicht behandelte Ausnahme des Typs "System.IO.IOException" ist in mscorlib.dll aufgetreten.
    Zusätzliche Informationen: Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird" oder es kommt ein ähnlicher Fehler.
    Kennt jemand einen Trick oder Tipp wie ich dies hinbekomme?

    Mfg
    • Bearbeitet freak29 Donnerstag, 4. Juli 2013 15:55
    Donnerstag, 4. Juli 2013 15:54

Antworten

  • Hallo, zeige mal deine bisherigen Versuche. Ich würde an deiner Stelle alle Elemente der ObservableCollection durch gehen und dann entsprechend umbenennen. Aus dem Kopf zusammen getippt so hier:

    for(int i = 0 ; i < list.Count ; ++i)
    {
        System.IO.File.Move(list[i].FileName, string.Format("__{0}{1}",i, System.IO.Path.GetExtension(list[i].FileName));
    }

    Ich habe vor den Dateinamen noch 2 Unterstriche dran gehangen, weil es sicherlich auch Nutzer gibt, die Dateien von vorn herein "0.png", "1.png" usw. nennen.

    MSDN-Artikel dazu:
    System.IO.Path.GetExtension(string)
    System.IO.File.Move(string, string)

    Die Exceptions kann ich aus meinem bisherigen Wissen kaum erklären. Die Meldung, das die Datei bereits verwendet würde, deutet darauf hin, das du einen Stream nicht geschlossen hast o.ä.
    Beachte auch die Berechtigungen, das du vielleicht garnicht in den Ordner schreiben kannst.


    - Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    ; Webseite | Code Beispiele | Facebook | Snippets | Twitter
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    • Als Antwort markiert freak29 Donnerstag, 4. Juli 2013 19:50
    Donnerstag, 4. Juli 2013 16:05
    Moderator
  • Hallo,
    ich habe das Problem nun doch in den Griff bekommen.
    Die Lösung war das ein "/" fehlte und das dass Image Element das Bild blockierte.
                    if (Xceed.Wpf.Toolkit.MessageBox.Show("Wollen sie wirklich diese " + list1.Items.Count.ToString() + " Elemente umbennenen?", "FOTO.SORT", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                    {
                        image1.Source = null;
                        for (int i = 0; i < ListItems.Count; i++)
                        {
                            System.IO.File.Move(pfad + "/" + ListItems[i].ToString(),string.Format(pfad + "/" +"__{0}{1}",i,System.IO.Path.GetExtension(ListItems[i].ToString())));
                        }
                        ListItems.Clear(); 
                     }      
    Vielen Dank nochmal für die Hilfe.

    Mfg
    • Als Antwort markiert freak29 Donnerstag, 4. Juli 2013 19:50
    Donnerstag, 4. Juli 2013 19:49

Alle Antworten

  • Hallo, zeige mal deine bisherigen Versuche. Ich würde an deiner Stelle alle Elemente der ObservableCollection durch gehen und dann entsprechend umbenennen. Aus dem Kopf zusammen getippt so hier:

    for(int i = 0 ; i < list.Count ; ++i)
    {
        System.IO.File.Move(list[i].FileName, string.Format("__{0}{1}",i, System.IO.Path.GetExtension(list[i].FileName));
    }

    Ich habe vor den Dateinamen noch 2 Unterstriche dran gehangen, weil es sicherlich auch Nutzer gibt, die Dateien von vorn herein "0.png", "1.png" usw. nennen.

    MSDN-Artikel dazu:
    System.IO.Path.GetExtension(string)
    System.IO.File.Move(string, string)

    Die Exceptions kann ich aus meinem bisherigen Wissen kaum erklären. Die Meldung, das die Datei bereits verwendet würde, deutet darauf hin, das du einen Stream nicht geschlossen hast o.ä.
    Beachte auch die Berechtigungen, das du vielleicht garnicht in den Ordner schreiben kannst.


    - Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    ; Webseite | Code Beispiele | Facebook | Snippets | Twitter
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    • Als Antwort markiert freak29 Donnerstag, 4. Juli 2013 19:50
    Donnerstag, 4. Juli 2013 16:05
    Moderator
  • Hallo,
    erstmal vielen Dank für ihrer schnelle Antwort.
    Eine gute Idee, probiere ich gleich mal aus.
    Versuche(Habe die Meisten gelöscht):

    int value = 0; foreach (var item in items) { string oldname = pfad + "/" + item.ToString(); string newname = pfad + "/" + value.ToString() + ".png"; System.IO.File.Move(oldname, newname); value++; ListItems.Clear(); } //string nameDerDatei = list1.SelectedIndex.ToString(); //string neueDatei = iii.ToString(); //System.IO.File.Move(pfad + "/" + nameDerDatei, pfad + "/" + neueDatei); //System.IO.File.Move(pfad + nameee, pfad + namme);

    "ListItems" ist die ObservableCollection.

    Das meiste was hier steht ist "etwas" abenteuerlich, aber ich hatte absolut keine Idee wie ich die Reinfolge "bekommen" soll.
    Das auskommentierte hat, aufgrund des SelectedIndex, gar keinen Sinn.^^

    Wenn die Items der ObservableCollection so wie die ListBox sotiert sind, dann wäre alles etwas einfacher.

    BTW: VS2012 läuft als Adminstrator und 

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    Also kann es eigentlich nicht daran liegen.
    Mfg 


    • Bearbeitet freak29 Donnerstag, 4. Juli 2013 16:41 Ergänzungen
    Donnerstag, 4. Juli 2013 16:39
  • Hallo,
    ich habe jetzt ihren Versuch auf meine Elemente angepasst, allerdings kommt:

    "Fehler 3 Keine Überladung für die Move-Methode nimmt 3 Argumente an."

    for (int i = 0; i < ListItems.Count; i++)
                        {
                            System.IO.File.Move(ListItems[i].ToString(),string.Format("__{0}{1}"),System.IO.Path.GetExtension(ListItems[i].ToString()));
                        }

    So sieht es jetzt aus.
    Irgendwelche Ideen?

    Mfg

    Donnerstag, 4. Juli 2013 16:57
  • Den Fehler lesen und die Parameterzahl überprüfen? Hinter dem "__{0}{1}" darf keine Klammer stehen. Dafür muss hinten noch eine dran.

    Wie genau sortierst du denn die Liste zwischen der ListBox und der eigentlichen Auflistung? Ich würde die Items direkt in der OC sortieren. Wenn das nicht der Fall ist (Konverter o.ä.?), dann musst du eine neue Auflistung erstellen die du auf die selbe weise von der Ursprungsauflistung erstellst. Diese verarbeitest du dann.

    Deine Ideen enthalten vor allem Logikfehler.


    - Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    ; Webseite | Code Beispiele | Facebook | Snippets | Twitter
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Donnerstag, 4. Juli 2013 17:44
    Moderator
  • Hallo,
    ich habe das Problem nun doch in den Griff bekommen.
    Die Lösung war das ein "/" fehlte und das dass Image Element das Bild blockierte.
                    if (Xceed.Wpf.Toolkit.MessageBox.Show("Wollen sie wirklich diese " + list1.Items.Count.ToString() + " Elemente umbennenen?", "FOTO.SORT", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                    {
                        image1.Source = null;
                        for (int i = 0; i < ListItems.Count; i++)
                        {
                            System.IO.File.Move(pfad + "/" + ListItems[i].ToString(),string.Format(pfad + "/" +"__{0}{1}",i,System.IO.Path.GetExtension(ListItems[i].ToString())));
                        }
                        ListItems.Clear(); 
                     }      
    Vielen Dank nochmal für die Hilfe.

    Mfg
    • Als Antwort markiert freak29 Donnerstag, 4. Juli 2013 19:50
    Donnerstag, 4. Juli 2013 19:49