Entwickler-Ecke

IO, XML und Registry - Kann nicht auf Array zugreifen


s4nDer - Do 28.08.08 11:30
Titel: Kann nicht auf Array zugreifen
Hallo,
ich habe eine Listbox und möchte die Werte der verschiedenen Elemente is eine Datei speichern.
Problem ist jetzt das ich nicht auf das Array zugreifen kann in dem die Elemente gespeichert sind.
ist wahrscheinlich ne sau billige Frage aber ich weiß es nich weil ich halt noch nicht so lange programmiere.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
        public void ListBox_fuellen()
        {
            //Pfad ermitteln den User ausgewählt hat
            DirectoryInfo nBrowsedDirectory = new DirectoryInfo(BrowseDialog.SelectedPath);

            //Files aus Ordner ermitteln
            FileInfo[] nFiles = nBrowsedDirectory.GetFiles(sSEARCH_PARAMETER);

            // Listbox mit Werten füllen
            for (int iSchleife = 0; iSchleife <= (nFiles.Length - 1); iSchleife++)
                DataListBox.Items.Add(nFiles[iSchleife]);
        }

        public void bSaveButton_Click(object sender, EventArgs e)
        {          
            //wenn Speichern gedrückt wird, Datei mit Inhalten erstellen
            if (SaveDialog.ShowDialog() == DialogResult.OK)
            {
                StreamWriter nCreateFile = new StreamWriter("Info.csv");
                foreach ( in DataListBox.SelectedItems)
                {
                    nCreateFile.WriteLine(TextBoxDataName.Text);
                    nCreateFile.WriteLine(TextBoxVersion.Text);
                    nCreateFile.WriteLine(TextBoxChangingDate.Text);
                    nCreateFile.Close();
                }                
            }
        }


Wie ihr seht fehlt in der foreach Schleife der Typ. Da will ich das Array eintragen.
Ergebnis soll dann sein das er nur die Daten in die Datei schreibt die selektiert sind.

Wäre für jede Art von Hilfe dankbar.

Gruß s4nDer


Skiller-1988 - Do 28.08.08 11:51

Also vorausgesetzt ich habe dich richtig verstanden, liegt das Problem darin das dass Array was du in der Methode "public void ListBox_fuellen()" anlegst nicht in der "public void bSaveButton_Click" verwenden kannst.
Das liegt daran dass du den Gültigkeitsbereich nicht beachtest weil das Array so ja nur lokal innerhalb der Methode ListBox_fuellen gültig ist.
Ich würde dir raten entweder das Array und seinen Inhalt zu übergeben oder es global in der Klasse zu Deklarieren, dann müsste es Funktionieren.


lothi - Do 28.08.08 11:51

Hallo

Meinst du so?


C#-Quelltext
1:
2:
foreach (string s in DataListBox.SelectedItems)  
                {


Gruss Lothi


s4nDer - Do 28.08.08 11:59

Ich habs jetzt einfach mal so probiert...

C#-Quelltext
1:
2:
                foreach (FileInfo test in DataListBox.SelectedItems)
                {


Wahrscheinlich brauche ich das Array garnich weil er ja weiß welche selektiert sind -.- sry
Problem is jetzt nur das es nicht hinbekommt wenn mehrere selektiert sind. bei nur einem klappt es, bei mehreren leider nicht.


JüTho - Do 28.08.08 12:12

Hallo,
user profile iconSkiller-1988 hat folgendes geschrieben:
Ich würde dir raten entweder das Array und seinen Inhalt zu übergeben oder es global in der Klasse zu Deklarieren, dann müsste es Funktionieren.

Davon möchte ich eher abraten: Ein Objekt (d.h. Instanz einer Klasse) sollte nur solange existieren, wie es benötigt wird. Wenn die Informationen aus dem Dir-Array nicht mehrfach benutzt werden, ist es nicht sinnvoll, sie "globaler" zu deklarieren.

@s4nDer
Dein Problem besteht darin, dass ListBox.SelectedItems eine SelectedObjectCollection ist, während die einzelnen Items nur allgemein vom Typ object sind. Aber Du bist der Programmierer: Du weißt, welche Art von Einträgen Du registriert hast. Du musst deshalb jedes einzelne Objekt passend casten:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
foreach (object o in DataListBox.SelectedItems)
{
    FileInfo info = o as FileInfo;
    //  Sicherheitsprüfung
    if (info != null) {
        nCreateFile.WriteLine(info.FileName);
    }
}

Dein Versuch kann u.U. klappen, es ist aber nicht sicher. Ich hätte eigentlich schon ein Veto des Compilers erwartet, denn SelectedItems enthält nunmal von der Definition her keine FileInfo-Instanzen.

Übrigens hast Du den Fehler gemacht, dass der StreamWriter in der Schleife geschlossen wird. Das führt natürlich im zweiten Durchgang zu einer Exception. Besser ist (auch aus diesem Grund) sowieso ein using-Block:

C#-Quelltext
1:
2:
3:
4:
using(StreamWriter nCreateFile = new StreamWriter("Info.csv")) 
{
    //  mach etwas damit
}   //  Close() wird am Ende von using() automatisch ausgeführt

Gruß Jürgen

PS. Vielleicht liegt der von Dir jetzt gemeldete Fehler gar nicht an der Schleife, sondern am StreamWriter. Auch deshalb ist es immer hilfreich, eine Exception genau zu untersuchen und anzugeben.


lothi - Do 28.08.08 12:15

Hallo

Ein Array brauchst du nicht das stimmt:


C#-Quelltext
1:
2:
3:
4:
foreach ( ListViewItem item in DataListBox.SelectedItems )
{
  string sitem = item.Text;
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


JüTho - Do 28.08.08 12:21

user profile iconlothi hat folgendes geschrieben:
Ein Array brauchst du nicht das stimmt:

Ich sehe beim Speichern nirgends ein Array - auch nicht bei s4nDer.

Bitte besser aufpassen:
user profile iconlothi hat folgendes geschrieben:

C#-Quelltext
1:
foreach ( ListViewItem item in DataListBox.SelectedItems )                    


ListViewItem hat nichts mit ListBox zu tun. Auch Dein obiger Vorschlag mit string führt in die Irre.

Jürgen


s4nDer - Do 28.08.08 12:54

Wie es aussieht liegt bzw. lag es wirklich an der Exception die beim 2. Durchlauf geworfen wurde aufgrund des Close() vom StreamWriter.
Erklärt natürlich auch warum es bei nur einem markierten Element funktioniert hat.
Schönen Dank an alle.


Skiller-1988 - Do 28.08.08 13:01

Sorry wegen meiner verwirrung mit dem ARRAY aber ich bin vom Thema des Threads ausgegangen "Kann nicht auf Array zugreifen" und ich hab es so verstanden das er das Array von der füllen Methode in der Save Methode verwenden will.
Aber als ich dann richtig überlegt habe was er da eigentich machen will ist mir auch aufgefallen das es nicht ums Array geht.
Naja wollte nur sagen vergesst das mit dem Array...


lothi - Do 28.08.08 14:53

Hallo

Also so verwirrend finde ich jetzt meine Input mit dem String nicht.
Eine ListBox mit Mehrfachauswahl kann man ja so auslesen und das habe ich auch so verstanden:
Zitat:

Wie ihr seht fehlt in der foreach Schleife der Typ.
8)

Gruss Lothi