Jedem Array eine String-Variable zuweisen

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von wobbesf.

    Jedem Array eine String-Variable zuweisen

    Hallo liebes Forum!

    Ich beschäftige mich heute zum ersten Mal seit etwa 3 Jahren wieder mit C# und habe direkt wieder ein Problem.
    Selbst damals als ich die Sprache im Vgl. zu heute noch "konnte", wusste ich dazu keine Lösung..

    Folgende Funktion:

    VB.NET-Quellcode

    1. string[] array1 = System.IO.Directory.GetFiles("C:\\Pictures", "*.gif");
    2. foreach (string s in array1)
    3. {
    4. listBox1.Items.Add(s);
    5. }


    Hier wird jede *.GIF Datei in eine ListBox eingetragen.
    Jetzt möchte ich allerdings nicht die Dateien in eine ListBox eintragen lassen, sondern für jede Datei ein String erstellen, also für 3 Dateien dann z.B. file1, file2, file3 mit den jeweiligen Speicherorten.

    Wie kann ich das verwirklichen?

    MfG,
    Stefan
    Hi
    ich hoffe, ich habe richtig verstanden, was du machen möchtest, also dass du die Dateien (in deinem Fall direkt die Dateipfade, besser wäre für deinen Fall ein System.IO.FileInfo-Objekt, das die Datei beschreibt) auf dem jeweiligen Speicherort gruppieren möchtest.
    Lege eine Klasse an, die den Speicherort als DictionaryInfo und die zugehörigen Dateien als FileInfo enthält:

    C#-Quellcode

    1. using System.IO;
    2. public class ContainerDescription
    3. {
    4. public IEnumerable<FileInfo> Files { get; private set; }
    5. public DirectoryInfo Directory {get; private set; }
    6. public ContainerDescription(DirectoryInfo directory, IEnumerable<FileInfo> files)
    7. {
    8. if (directory == null) //das beinhaltende Verzeichnis darf nicht fehlen
    9. throw new ArgumentNullException("directory");
    10. if (files == null) //files darf nicht null sein (aber leer!)
    11. throw new ArgumentNullException("files");
    12. Directory = directory;
    13. Files = files;
    14. }

    Im Konstruktor gibst du eben das enthaltende Verzeichnis und die gewählten Dateien an. Du kannst statt der IEnumerable<FileInfo> auch einen Listen-Typen angeben und der Property den Wert im Konstruktor zuweisen (z.B. List<T> oder ggf. besser IList<T> in Verbindung mit einer System.ComponentModel.BindingList<T>). Damit erlaubst du dem Benutzer, manuell Elemente einzufügen. Es gibt bei obigem Modell halt keine Garantie, dass wirklich alle Dateien aus files wirklich in der directory liegen (das IEnumerable könnte sich theoretisch ändern, daher habe ich die Abfrage weggelassen ;)). Es wäre vmtl. sogar praktischer, das ganze über eine Liste zu modellieren, dann kannst du die ListBox.DataSource auf die Liste festlegen und die Daten werden direkt übernommen.
    Da du die ListBox.Items-Eigenschaft verwendest und nicht die ListBox.DataSource-Eigenschaft hier nochmal eine kurze Erklärung: ListBox.DataSource ermöglicht dir, direkt eine Liste anzugeben, die als Quelle für die anzuzeigenden Items verwendet werden soll. Änderst du die zugrunde liegende Liste, ändert sich auch die Anzeige der Liste. Hierbei gilt allerdings, dass du eine System.ComponentModel.BindingList<T> verwenden solltest, da diese über Änderungen informiert. Die Verwaltung über ListBox.Items ist sehr unpraktisch, da man dann entweder die ListBox-Items als direkte Datenquelle verwendet, was sehr unsauber ist, oder die Liste mit einer weiteren "synchronisiert", was unnötig ist. Die ListBox.DataSource erlaubt folgendes:

    C#-Quellcode

    1. var colors = new System.ComponentModel.BindingList<Color>();
    2. colors.Add(Color.Red);
    3. _colorListBox.DataSource = colors
    4. colors.Add(Color.Blue);

    Damit sollten zwei Elemente in der ListBox angezeigt werden, wobei das erste eben Rot angibt und das zweite Blau. Um nun die Darstellung schöner zu gestalten, wird DisplayMember festgelegt:

    C#-Quellcode

    1. _colorListBox.DisplayMember = "Name"

    DisplayMember legt den Namen der Eigenschaft fest, deren Wert anzuzeigen ist, also hier der Anzeigename der Farbe. Zusätzlich hierzu gibt es noch ValueMember. Dieser gibt an, welcher Wert bspw. von SelectedValue zurückgegeben wird. Ist der Wert nicht gesetzt, wird SelectedItem zurückgegeben, sonst der Eigenschaft mit dem angegebenen Namen zugehörige Wert.

    Sofern du alle Dateien eines Ordners benötigst, genügt dir ggf. auch DirectoryInfo.GetFiles() oder so.

    Gruß
    ~blaze~
    Jaaaa danke sehr für die schnelle Antwort, und das noch um die Zeit! :)
    Es funktioniert jetzt! :)

    Habe aber schon ein neues Problem..:
    Ich wollte die Resourcen mal etwas aufräumen, und habe dann ein paar Dateien gelöscht..
    Ich war mir sicher, dass die 2-3 Dateien die ich gelöscht habe nirgendwo mehr verwendet werden.
    Eine der Dateien wurde anscheinend aber von einem Button in meiner Toolbox benutzt,
    und jetzt sind komischerweise alle Buttons und Menüs in meiner Toolbox verschwunden, sie ist auf einmal komplett leer..

    PS: Arbeite mit Visual C-Sharp 2008, und in der Form1.Designer.cs sind alle Elemente noch vorhanden..
    Kann mir jemand helfen?
    MfG

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „wobbesf“ ()