Entwickler-Ecke
WinForms - Ordner in einem Panel auslesen
Ilki - Mo 20.09.10 14:14
Titel: Ordner in einem Panel auslesen
Hallo,
bin neu in diesem forum und habe folgendes Problem,
ich möchte alle Dateien die sich in einem Ordner befinden in einem Panel auflisten.
es soll wie eine ordnerstruktur dargestellt werden.
soll in etwa so aussehen
ordner 1
Bild 1
Bild 2
ordner 2
Bild 1
Hab das bis jetzt so gemacht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| String[] astrMediaDirs = Directory.GetDirectories(strPhysicalApplicationPath + "\\archiv"); for (int i = 0; i < astrMediaDirs.Length; i++) { String[] astrMediaFiles = Directory.GetFiles(astrMediaDirs[i]); if (astrMediaFiles.Length > 0) { string strDirName = astrMediaDirs[i].Substring(astrMediaDirs[i].LastIndexOf("\\") + 1); ListBox1.Items.Add(strDirName);
for (int k = 0; k < astrMediaFiles.Length; k++) { ListBox1.Items.Add(astrMediaFiles[k]); } } } |
es wird aber momentan nur der komplette Pfad angezeigt. die bilder sollen aber als links angezeigt werden
kann mir jemand weiterhelfen??
Moderiert von
Christian S.: C#-Tags hinzugefügtModeriert von
Christian S.: Topic aus C# - Die Sprache verschoben am Mo 20.09.2010 um 16:10
Yogu - Mo 20.09.10 14:26
Ilki hat folgendes geschrieben : |
C#-Quelltext 1:
| string strDirName = astrMediaDirs[i].Substring(astrMediaDirs[i].LastIndexOf("\\") + 1); | |
Das geht einfacher:
C#-Quelltext
1:
| string strDirName = Path.GetFileName(astrMediaDirs[i]); |
Ilki hat folgendes geschrieben : |
es wird aber momentan nur der komplette Pfad angezeigt. die bilder sollen aber als links angezeigt werden
kann mir jemand weiterhelfen?? |
Wie meinst du das? In der Liste sollte der Ordnername des Verzeichnisse stehen, in denen Dateien vorhanden sind, gefolgt von den vollständigen Pfadangaben der Dateien. Genau das steht in deinem Code. Was meinst du damit, dass "die Bilder links angezeigt werden" sollen?
Necaremus - Mo 20.09.10 14:29
ich denke er meint mit "als links" dass man, bei anklicken der bilder - bzw. der einträge - diese im default-programm geöffnet werden.
das müsste du mit einer einfachen if-abfrage hinkriegen können, mit der du die endung der datei abfragst.
Yogu - Mo 20.09.10 14:53
Necaremus hat folgendes geschrieben : |
| ich denke er meint mit "als links" dass man, bei anklicken der bilder - bzw. der einträge - diese im default-programm geöffnet werden. |
Nein, wie konnte das passieren? Da hat wohl jemand das "als" verschluckt und gerade wieder ausgespukt :o
Möchtest du wirklich, dass die Einträge
optisch hervorgehoben werden sollen - also blau, unterstrichen o.ä.? Das ist wirklich nicht einfach. Du könntest vielleicht für jeden Eintrag ein
LinkLabel erstellen, das wird aber schnell unübersichtlich.
Wenn die Bilder beim Auswählen angezeigt werden sollen, solltest du im
SelectionChanged-Ereignis den Inhalt der aktuellen Zeile an deine Image-Komponente weitergeben.
Ilki - Mo 20.09.10 15:07
ich glaube ich konnte mich nicht richtig ausdrücken was ich meinte :S
also ich hab einen ordner der unterordner enthält und diese unterordner enthalten bilder, videos, texte etc.
dieser ordner soll in einem Panel ausgelesen werden. sobald ich z.b. ein unterordner hinzufüge soll es zugleich in meiner asp.net-webseite geändert werden.
die Inhalte (Bilder) sollen als Links dargestellt werden, sobald ich drauf klicke sollen diese im Panel erscheinen.
wissts ihr was ich meine??
p.s. ich bin weiblich :)
Necaremus - Mo 20.09.10 15:24
also so, wie ich meinte, nur dass es keine wirklichen "links" sind^^
du hast die pfade zu deinen bildern, dank deinen einträgen ja schon, nehme ich an :)
falls nicht, schau mal
hier [
http://www.c-sharp-forum.de/topic_listbox+eeintraege+mit+pfad+verknuepfen_101598.html] rein. Hier wird erklärt, wie du deiner listbox items hinzufügen kannst, die mehr als nur den namen speichern (z.b., wie bei dir, dateipfad)
dann gehst du eifnach, wie yogu schon schrieb, in das SelectionChanged-Event und schaust da nach, ob das ausgewählte item eine BildDatei hinterlegt hat.
falls ja, lässt du das in deiner picbox anzeigen - fertig :)
Ilki - Mo 20.09.10 15:52
Necaremus du hast mich schon richtig verstanden...
das was Yogu gesagt hat
string strDirName = Path.GetFileName(astrMediaDirs[i]);
hat auch geklappt nur die bilder werden als ganzes Pfad angezeigt. ich will dass nur der letzt Teil ( der Name des Bildes ) angezeigt wird
hab ja 2 schleifen... die erste wird so angezeigt wie ich es will und die zweite schleife zeigt den ganzen Pfad an...
momentaner stand:
C:\Inetpub\wwwroot\Startseite_NEU\archiv\Bilder\Blume.jpg
stattdessen soll er mir nur Blume.jpg anzeigen (als Link)
Yogu - Mo 20.09.10 18:17
In der äußeren Liste kürzt du den Pfad ja schon mithilfe
String.lastIndexOf und
String.replace. Das könntest du durch
Path.GetFileName vereinfachen.
In der inneren Schleife - die, die die Dateien auflistet - fehlt jegliche Kürzung. Du musst dort also auch ein
Path.GetFileName einbauen. Natürlich braucht man aber den kompletten Pfad, um ein Bild, Video oder Textdokument anzeigen zu können. Und wie du die Situation in den Griff bekommst, kannst du im Thema
listbox eeinträge mit pfad verknüpfen [
http://www.c-sharp-forum.de/topic_listbox+eeintraege+mit+pfad+verknuepfen_101598.html] nachlesen.
Ilki - Mo 20.09.10 20:17
die äußere schleife hab ich jetzt mit path.GetFileName vereinfacht
ist ja die hier:
C#-Quelltext
1:
| string strDirName = Path.GetFileName(astrMediaDirs[i]); |
und was geb ich dann für die innere schleife an, so dass nur die Dateinamen stehen??
du hast ja gemeint dass da jegliche kürzung fehlt, und die wären?
Moderiert von
Christian S.: C#-Tags hinzugefügt
Yogu - Mo 20.09.10 20:23
Ilki hat folgendes geschrieben : |
was geb ich dann für die innere schleife an, so dass nur die Dateinamen stehen??
du hast ja gemeint dass da jegliche kürzung fehlt, und die |
Ilki hat folgendes geschrieben : |
ist ja die hier:
string strDirName = Path.GetFileName(astrMediaDirs[i]); |
;)
(also natürlich
ListBox1.Items.Add(Path.GetFileName(astrMediaFiles[k]);))
Ilki - Di 21.09.10 09:04
ich weiß ich nerv schon, aber ich hätte da noch eine frage :S
wie kann ich denn jetzt die 2. Schleife nach innen versetzen? so dass es wie eine Ordnerstruktur aussieht??
in etwa so:
- Bilder
Bild 1
Bild 2
- Videos
Video 1
Video 2
gibts da auch eine funktion in der ich -Bilder und -Videos auch auf und zuklappen kann??
Necaremus - Di 21.09.10 09:07
wegen dem filename:
listbox eeintraege mit pfad verknuepfen [
http://www.c-sharp-forum.de/topic_listbox+eeintraege+mit+pfad+verknuepfen_101598.html]
dort ist es bereits erklärt.
-> eigene klasse für die listBox erstellen.
-> du kannst auch noch, wenn du willst, der klasse einen enum hinzufügen wie zb
public enum Types { Folder, Picture }
dann gehst du in dein
SelectionChanged Event und schaust da nach der ausgewählten datei.
hier nen kleines snippet:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| private void listBox_SelectedIndexChanged(object sender, EventArgs e) { ListEntry entry = (ListEntry)listBox.SelectedItem; if (entry.Type == ListEntry.Types.Picture) { pictureBox.Image = Image.FromFile(entry.FileName); } } |
und hier nommal die (von mir veränderte) ListEntry Klasse:
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| public class ListEntry { private string fileName; private string displayName; private Types type;
public enum Types { Folder, Picture } public ListEntry(string fileName, string displayName, Types type) { this.fileName = fileName; this.displayName = displayName; this.type = type; }
public ListEntry(string serialized) { int equalSignPos = serialized.LastIndexOf('='); int semiPos = serialized.LastIndexOf(';');
this.fileName = serialized.Substring(0, equalSignPos - 1); this.displayName = serialized.Substring(equalSignPos + 1, semiPos - 1); string check = serialized.Substring(semiPos + 1); if (check == "Folder") this.type = Types.Folder; else this.type = Types.Picture; }
public string FileName { get { return fileName; } set { fileName = value; } } public string DisplayName { get { return displayName; } set { displayName = value; } } public Types Type { get { return type; } set { type = value; } }
public string Serialize() { return fileName + "=" + displayName; }
public string ToString() { return displayName; } } |
wegen deiner nächsten frage:
ja, aber dann würde ich ein anderes steuerelement empfehlen.
entweder ListView oder TreeView, wahrscheinlich eher letzteres.
solltest du mit einem dieser Steuerelemente arbeiten wollen funktioniert es prinzipiell genau so, nur dass du deine eigene klasse von dem SteuerElement-Items ableiten muss z.B.:
C#-Quelltext
1:
| public class MyClass : TreeNode ListViewItem [...] |
/edit: bei einem TreeView kannst du die items voneinander abhängig machen, sodass du zb einem ordner als sub-items die ganzen dateien im ordner zuweisen kannst (dann hast du auch automatisch das auf und zu klappen ;)) bei einem ListView würde ich über die Gruppen gehen...
/edit2: hier kleines beispiel für TreeView:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var picFolder = new MyTreeNode("Pictures"); var files = dir.GetFiles("*.jpg", SearchOption.AllDirectories); foreach (var file in files) picFolder.Nodes.Add(new MyTreeNode(file.FullName, file.Name, ListEntry.Types.Picture)); treeView.Nodes.Add(folder); var vidFolder = new MyTreeNode("Videos"); files = dir.GetFiles("*.VIDEO^^", SearchOption.AllDirectories); foreach (var file in files) vidFolder.Nodes.Add(new MyTreeNode(file.FullName, file.Name, ListEntry.Types.Video)); |
du kannst natürlich auch die normale ordnerstruktur aufbauen, wenn dir das lieber ist, sodass dann videos und pics vermischt sind - bzw. sein könnten. das hier soll ja nur als beispiel dienen ;)
Ilki - Di 21.09.10 10:10
wie kann ich aus diesem quellcode ein TreeView machen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| String[] astrMediaDirs = Directory.GetDirectories(strPhysicalApplicationPath + "\\archiv"); for (int i = 0; i < astrMediaDirs.Length; i++) { String[] astrMediaFiles = Directory.GetFiles(astrMediaDirs[i]); if (astrMediaFiles.Length > 0) { string strDirName = System.IO.Path.GetFileName(astrMediaDirs[i]); ListBox1.Items.Add(strDirName);
for (int k = 0; k < astrMediaFiles.Length; k++) { ListBox1.Items.Add(System.IO.Path.GetFileName(astrMediaFiles[k])); } } } |
So dass die Ordner aus einem Pfad gelesen werden und eine Baumstruktur haben?
Moderiert von
Christian S.: C#-Tags hinzugefügt
Necaremus - Di 21.09.10 10:17
hier mal nen kleines snippet aus nem testprojekt, wo ich auch ein treeview so wie die ordner struktur ist, fülle
wenn du fragen hast, frag^^
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| private void btPath_Click(object sender, EventArgs e) { if (!isRunning) { cancel = false; FolderBrowserDialog dialog = new FolderBrowserDialog(); if (dialog.ShowDialog() == DialogResult.OK) { rootFolder = new DirectoryInfo(dialog.SelectedPath); tfwFiles.Clear(); tvFiles.Nodes.Clear(); tbPath.Text = rootFolder.FullName; TreeNode parentNode = new TreeNode(rootFolder.Name); tvFiles.Nodes.Add(parentNode); GetSubFolders(rootFolder, parentNode);
cancel = false; } } }
private void GetSubFolders(DirectoryInfo folderInfo, TreeNode parentNode) { Application.DoEvents(); if (folderInfo.Exists) { DirectoryInfo[] folders; folders = folderInfo.GetDirectories(); foreach (DirectoryInfo subFolder in folders) { if (cancel) break; TreeNode node = new TreeNode(subFolder.Name); parentNode.Nodes.Add(node); GetSubFolders(subFolder, node); }
FileInfo[] files; files = folderInfo.GetFiles(tbFilter.Text); pBar.Maximum = files.Length; bool add = true; foreach (FileInfo file in files) { if (cancel) break;
pBar.Value = ++pBar.Value; pBar.Value = --pBar.Value; pBar.Value = ++pBar.Value; Application.DoEvents();
tfwFiles.Add(file); TreeNode n = new TreeNode(file.Name); n.Tag = file; parentNode.Nodes.Add(n); if (add) { parentNode.Tag = file; add = false; } } pBar.Value = 0; files = folderInfo.GetFiles("*.map"); foreach (FileInfo file in files) { if (cancel) break; TreeNode n = new TreeNode(file.Name); n.Tag = file; parentNode.Nodes.Add(n); } } } |
/edit: mir fällt gerade auf, dass das garnicht so elegant gelöst ist, da ich die suche nicht in einem externen thread auslagere^^
bzw, @Allgemeinenheit: ich hätt au ne frage ;D
ist es bei solchen funktionen, die ja hauptsächlich auf controls zugreifen, nicht empfehlenswert diese in einem eigenen Thread zu packen? ich frag, da ich selber noch seeeehr neu beim proggen bin - hab diesen monat mit ausbildung angefangen^^
/edit2: *Node: nächste mal bissel besser auf interpunktion achten^^*
Ilki - Mi 22.09.10 08:52
also meine nächste frage ist... :)
wie kann ich die zweite Schleife als Link darstellen??
also wenn man z.b. auf bild.jpg klickt soll in einem neuen fenster das Bild angezeigt werden...
Necaremus - Mi 22.09.10 09:05
was genau meinst du mit "link"?
meinst du, dass du das bild mit einem Default-Prog öffnest oder mit einem von dir selbst erstelltem Fenster?
Default müsste mit
Process proc = Process.Start(FilePath); gehen.
- teste es einfach mal, bin mir gerade nicht sicher, aber glaube, dass windoof dann das für den dateitypen eingetragenes programm startet. :)
für ein eigenes fenster bastelst du dir einfach ein fenster mit ner picbox und ner kleinen funktion wie
pseudo code
C#-Quelltext
1: 2: 3: 4: 5:
| public void Load&Show(string filePath) { this.picBox.Load(filePath); this.Show(); } |
und rufst die funktion dann einfach auf.
Ilki - Mi 22.09.10 09:25
also mit Link meine ich, dass man bild.jpg selektieren kann und dann das Bild angezeigt wird, nicht in einem sebslerstellten Fenster,
das bild soll einfach in einem neuen Internet Fenster angezeigt werden....
konnte ich micht etwas verständlich ausdrücken?? :)
Ilki - Mi 22.09.10 13:42
ich hab hier mal versucht aus meinem quelltext ganz oben ein TreeView einzubauen. klappt aber immer noch nicht :(
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| string strPhysicalApplicationPath = AppPath; if (!Page.IsCallback || !Page.IsPostBack)
TreeView2.Visible = false; TreeView2.Nodes.Clear(); String[] astrMediaDirs = Directory.GetDirectories(strPhysicalApplicationPath + "\\archiv"); for (int i = 0; i < astrMediaDirs.Length; i++) { TreeNode Multimedia = new TreeNode(); String[] astrMediaFiles = Directory.GetFiles(astrMediaDirs[i]); if (astrMediaFiles.Length > 0) { String strDirName = System.IO.Path.GetFileName(astrMediaDirs[i]); TreeView2.Nodes.Add(Multimedia); for (int k = 0; k < astrMediaFiles.Length; k++) { TreeNode xyz = new TreeNode(); String[] astrMediaText = Directory.GetFiles(astrMediaDirs[k]); TreeView2.Nodes.Add(xyz); } } } |
es zeigt mir keine fehler an, aber wenn ich es debugge wird nichts angezeigt...
kann mir jemand weiter helfen?
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Necaremus - Mi 22.09.10 14:17
mhm... so wie das aussieht "funktioniert" der quellcode ja auch.
er macht nur "nichts" ^^
deine TreeNodes, die du ja zu hauf erstellst, weißt du keine werte zu.
z.B.:
C#-Quelltext
1: 2:
| TreeNode n = new TreeNode("name"); n.Tag = new FileInfo("path") n.Tag = "path"; |
sonst hast du leere treeNodes... und was bringt dir ein TreeView mit leeren nodes?^^
ajo sollte dein code so sein wie gezeigt, also:
C#-Quelltext
1: 2: 3:
| if(yourBool) treeView.Visible = false; |
oder so:
C#-Quelltext
1: 2: 3: 4: 5:
| if(yourBool) { treeView.Visible = false; } |
PS: du kannst [ cs ] code [/ cs ] schreiben :o
Ilki - Do 23.09.10 09:00
Guten Morgen Necaremus,
Wenn ich in die Klammer einen Wert eingebe, dann wird der Wert angezeigt.
Es sollen ja aber die Ordnernamen und die Inahlte der Ordner aus einem Pfad angezeigt werden.
und es werden die Plus bzw. minussymbole vor den Nodes nicht angezeigt, also ich könnte sie nicht auf und zuklappen. woran könnte das liegen??
was ist denn der unterschied zwischen den beiden Codes?
Yogu - Do 23.09.10 19:39
Ilki hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3: 4: 5: 6:
| string strPhysicalApplicationPath = AppPath; if (!Page.IsCallback || !Page.IsPostBack)
TreeView2.Visible = false; TreeView2.Nodes.Clear(); | |
Das ist extrem missverständlich: Soll die Bedingung
!Page.IsCallback || !Page.IsPostBack nur für die nächste Anweisung
TreeView2.Visible = false; gelten oder für den ganzen Block? Der Einzug in den folgenden Zeilen deutet auf letzteres hin, tatsächlich ist jedoch nur die erste Anweisung betroffen. (
{ } vergessen?)
Das meinte
Necaremus am Ende seines Posts.
Ilki hat folgendes geschrieben : |
C#-Quelltext 15: 16: 17: 18: 19: 20:
| /* ... */ for (int k = 0; k < astrMediaFiles.Length; k++) { TreeNode xyz = new TreeNode(); String[] astrMediaText = Directory.GetFiles(astrMediaDirs[k]); TreeView2.Nodes.Add(xyz); } | |
Du fügst den Konten
xyz auch direkt dem TreeView hinzu, was dazu führt, dass er auf erster Ebene angezeigt wird. Du wolltest ihn aber eigentlich dem Ordner untergeordnet haben - kein Problem, fügt ihn einfach
Multimedia hinzu :idea:
danielf - Fr 24.09.10 06:56
Ich denke Ilki meinte das wenn man ein Node erzeugt (TreeNode xyz = new TreeNode()) und dieses dem TreeView2 hinzufügt (TreeView2.Nodes.Add(xyz)), dass man dann nichts erwarten kann weil es einfach leer ist. Deshalb hat er gezeigt, wie man ein Node füllt, damit auch Daten angezeigt werden.
Gruß
Necaremus - Mo 27.09.10 08:18
öhm... ja.. ich meitne es so, so wie yogu schrieb :o
zu deinem "im browser anzeigen" des bildes:
das ist relativ problematisch, denke ich (sind nun nur vermutungen, ich habe nichts davon überprüft):
jeder browser hat zwar die möglichkeit bilder anzuzeigen, allerdings werden sich die params, falls überhaupt vorhanden, beim programmstart sicherlich unterscheiden.
Das heißt: du müsstest im programm erstmal schauen, welcher browser als default browser eingestellt ist, dann müsstest du jenachdem dein aufruf anders gestalten.
das ist alles möglich, allerdings etwas umständlich^^
viel einfacher wäre es mit einem einfachen Process proc = Process.Start("YourFullFileName.Here");, wie oben schonmal erwähnt^^ - bei diesem befehl sucht der computer selbst nach dem default-programm für deine datei - vergleichbar mit einem einfachen doppelklick auf die datei.
wegen den nodes:
du musst, um es untergeordnet zu kriegen, den nodes auch entsprechende werte zuweisen.
bei meinem snippet (auf der ersten seite) habe ich das mit parentNode.Nodes.Add(node); gemacht. wobei "parentNode" dein FolderNode sein muss und "node" dein PictureNode.
Den Anzeigenamen deines TreeNodes kannst du in den Klammern bestimmten TreeNode node = new TreeNode("MyTreeNodeName");
ich hoffe ich konnte dir weiter helfen
so far
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!