Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Eigener kleiner Explorer: Pfad der aktuellen Datei ermitteln
BlackArma
myCSharp.de - Member

Avatar #avatar-3428.jpg


Dabei seit:
Beiträge: 7

Themenstarter:

Eigener kleiner Explorer: Pfad der aktuellen Datei ermitteln

beantworten | zitieren | melden

Moin alle zusammen,

ich baue mir gerade einen kleinen 2D-Editor wo auch die ganzen Grundfunktionen schon funktionieren. Nun wollte ich im unteren Bereich einen kleinen Explorer, wie bei Unity wenn es jemand kennt, hinzufüge mit einer kleinen PictureBox in der die gerade ausgewählte Grafik angezeigt wird. Da ich bisher noch nicht so viel mit C# gemacht habe und den bisherigen Explorer nur anhand von Tutorials zusammengeschraubt habe stehe ich im Moment ein wenig auf dem Schlauch.

Ich habe ein treeView in dem die Ordnerstruktur angezeigt wird und durch das ich auch navigieren kann während in meiner listBox alle Daten im aktuellen Ordner aufgelistet werden. Nun möchte ich in der listBox ein Item anklicken können um dann in der PictureBox ein kleines Vorschaubild zu sehen.

Das ist mein bisheriger Code:


        protected override void OnLoad( EventArgs e )
        {
            TreeNode rootNode = new TreeNode("C:\\");
            treeView1.Nodes.Add(rootNode);
            addCildNotes(rootNode);
            treeView1.Nodes[0].Expand();
            base.OnLoad(e);
        }

        private void addCildNotes(TreeNode dirNode)
        {
            DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath);
            try
            {
                foreach (DirectoryInfo dirItem in dir.GetDirectories())
                {
                    TreeNode newNode = new TreeNode(dirItem.Name);
                    dirNode.Nodes.Add(newNode);
                    newNode.Nodes.Add("*");
                }
            }
            catch (UnauthorizedAccessException error)
            {
                MessageBox.Show(error.ToString());
            }
        }

        private void treeView1_BeforeExpand_1(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Nodes[0].Text == "*")
            {
                treeView1.BeginUpdate();
                e.Node.Nodes.Clear();
                addCildNotes(e.Node);
                treeView1.EndUpdate();
            }
        }

        private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
        {
            DirectoryInfo dir = new DirectoryInfo(e.Node.FullPath);
            listBox1.Items.Clear();
            listBox1.Items.AddRange(dir.GetFiles());
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            DirectoryInfo dir = new DirectoryInfo(e.Node.FullPath);
            listBox1.Items.Clear();
            listBox1.Items.AddRange(dir.GetFiles());
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Code um das Bild in der PictureBox anzuzeigen
        }

Eigentlich brauche ich ja nur den Datenpfad vom Bild aber ich habe keine Ahnung wie ich den bekomme.

Ich bedanke mich jetzt schon mal!
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo BlackArma,

du kennst doch TreeNode.FullPath und benutzt es schon. Das musst du nur aus dem aktuellen/selektieren TreeNode auslesen und mit Path.Combine mit dem Dateinamen zusammenfügen.

Bitte beachte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore
private Nachricht | Beiträge des Benutzers
BlackArma
myCSharp.de - Member

Avatar #avatar-3428.jpg


Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Das hat mir schon mal weiter geholfen.

Inzwischen habe ich es so gemacht:
Ich habe ein Get() und Set() für die TreeNode in addChildNotes gemacht da ich ja dort bereits den Pfad habe wo ich mich gerade befinde.

Jetzt wollte ich es so machen das wenn ich nun ein Item in meiner listBox selektiere den Pfad mit meiner Funktion hole und diesen mit dem Namen des aktuell selektieren Items aus der listBox verknüpfe so wie du es vorgeschlagen hast. Doch irgendwie geht da noch etwas schief da ich einen Datenpfad erhalte den Bitmap nicht nimmt und ungefähr folgend aussieht: C:\\\\Bilder\Test_Bild.png . Ich nehme mal an das es an den beiden Backslashes die zu viel sind liegt aber ich weiß nicht wo die her kommen ^^
private Nachricht | Beiträge des Benutzers
MatthiasDietschweiler
myCSharp.de - Member



Dabei seit:
Beiträge: 7

beantworten | zitieren | melden

Die 4 Backslashes sind nicht zuviel. So wird der Pfad nur angezeigt. Der effektive Werte beinhaltet nur 2 Backslashes. Diese gehören aber zu den "Sonderzeichen" welche in einem string im .Net mit vorangehendem Backslash als "normales" Zeichen interpretiert werden.
Es muss also etwas anderes sein, das verhindert, dass du an dein Bitmap kommst.
Zitat
[...] Doch irgendwie geht da noch etwas schief[...]

Da musst du schon genauere Angaben machen.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo MatthiasDietschweiler,
Zitat
Die 4 Backslashes sind nicht zuviel. So wird der Pfad nur angezeigt.
zumindest im Debugger. Wenn man den Pfad mit einer MessageBox (pfui) oder auf der Console ausgibt oder in eine Datei schreibt, dann werden nur soviele Backslashes angezeigt, wie im String tatsächlich enthalten sind.

Wenn weiter hinten im Pfad - wie angeben - tatsächlich nur ein Backslash steht, dann stehen vorne wohl wirklich vier.
Zitat
Der effektive Werte beinhaltet nur 2 Backslashes
Wäre immer noch einer zuviel.
Zitat
Diese gehören aber zu den "Sonderzeichen" welche in einem string im .Net mit vorangehendem Backslash als "normales" Zeichen interpretiert werden.
Nur in einem String-Literal, also einem String in Anführungszeichen im Quelltext. Dort interpretiert der Compiler (einmalig zur Übersetzungszeit) die Backslashes so, wie du geschrieben hast. Wir sprechen hier aber nicht über Literale, sondern über Strings, die zur Laufzeit erzeugt bzw. abgerufen werden. Da erfolgt keine solche Ersetzung.


Hallo BlackArma,
Zitat
Da musst du schon genauere Angaben machen.
Dem will ich mit meiner Antwort allerdings nicht entgegen stehen (siehe [Hinweis] Wie poste ich richtig? Punkt 5), auch wenn ich schon eine Vermutung habe.

Hast du einen TreeNode (als Wurzel bzw. unter dem Knoten für das Laufwerk) im Baum, dessen Text nur aus einem Backslash besteht? Das würde dann den beschriebenen Effekt erzeugen. Der Windows Explorer hat keinen solchen Knoten. Lass ihn einfach weg.

Wenn es das nicht war, solltest du aufgrund der gegebenen Hinweise ermitteln, wieviele Backslashes denn nun tatsächlich enthalten sind. Allerdings denke ich auch, dass überflüssige Backslashes eigentlich ignoriert/übergangen werden sollten. Prüfe mal, ob sich die Datei tatsächlich da befindet, wo du sie vermutest.

herbivore
private Nachricht | Beiträge des Benutzers
pikachu
myCSharp.de - Member



Dabei seit:
Beiträge: 64
Herkunft: Überlingen

beantworten | zitieren | melden

ich kenn mich jetzt noch nicht so mit c# aus aber vllt geht das ja auch mit Directory.GetCurrentDirectory?
Hier der link
Directory.GetCurrentDirectory-Methode
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo pikachu,

nur wenn man vorher das CurrentDirectory auf das gewünschte Verzeichnis gesetzt hat (und mit den Konsequenzen bei der Verwendung relative Pfade leben kann).

herbivore
private Nachricht | Beiträge des Benutzers
BlackArma
myCSharp.de - Member

Avatar #avatar-3428.jpg


Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Zitat von herbivore
Hast du einen TreeNode (als Wurzel bzw. unter dem Knoten für das Laufwerk) im Baum, dessen Text nur aus einem Backslash besteht?

Nein, ich habe keine Wurzel im Baum die die aus Backslashes besteht, wenn ich mir den Pfad mit Path.Combine() zusammenführe und dann ausgeben lasse erscheint dieser in der richtigen Form, also nur mit zwei Backslashes nach dem C: .
Zitat von herbivore
Prüfe mal, ob sich die Datei tatsächlich da befindet, wo du sie vermutest.
Die Datei ist auch dort wo sie sein sollte, ich kann sie überall mit meine Explorer finden wo ich sie zuvor hinterlegt habe.
private Nachricht | Beiträge des Benutzers
Spyke
myCSharp.de - Member



Dabei seit:
Beiträge: 146

beantworten | zitieren | melden

Prüf mal was als PathSeparator in der TreeView angegeben ist.
private Nachricht | Beiträge des Benutzers
BlackArma
myCSharp.de - Member

Avatar #avatar-3428.jpg


Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Zitat von Spyke
Prüf mal was als PathSeparator in der TreeView angegeben ist.

Der PathSeparator ist bei mir default, also der Backslash.

Langsam regt es mich ziemlich auf
Ich weiß einfach nicht wie ich das weg bekomme.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BlackArma am .
private Nachricht | Beiträge des Benutzers