Autor Beitrag
Ilki
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 20.09.10 14:14 
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:
ausblenden 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++)
                    {
                        //Image myImage = new Image();
                        //myImage.ImageUrl = astrMediaFiles[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 user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 20.09.2010 um 16:10
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.09.10 14:26 
user profile iconIlki hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
string strDirName = astrMediaDirs[i].Substring(astrMediaDirs[i].LastIndexOf("\\") + 1);					

Das geht einfacher:

ausblenden C#-Quelltext
1:
string strDirName = Path.GetFileName(astrMediaDirs[i]);					

user profile iconIlki hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.09.10 14:53 
user profile iconNecaremus hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: 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 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 nachlesen.
Ilki Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 20.09.10 20:17 
die äußere schleife hab ich jetzt mit path.GetFileName vereinfacht
ist ja die hier:

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.09.10 20:23 
user profile iconIlki hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconIlki hat folgendes geschrieben Zum zitierten Posting springen:
ist ja die hier:

string strDirName = Path.GetFileName(astrMediaDirs[i]);

;)

(also natürlich ListBox1.Items.Add(Path.GetFileName(astrMediaFiles[k]);))
Ilki Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Di 21.09.10 09:07 
wegen dem filename: listbox eeintraege mit pfad verknuepfen
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:
ausblenden 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:
ausblenden volle Höhe 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)
        {
            // serialized ist ein String der Form "fileName=displayName;type"

            // Also suchen wir nach dem letzten Vorkommen eines Gleichheitszeichens
            int equalSignPos = serialized.LastIndexOf('=');
            // und dem letzten Vorkommen eines Semikolons
            int semiPos = serialized.LastIndexOf(';');

            // Der Dateiname ist links vom Gleichheitszeichen, der Anzeigename in der mitte, type ganz rechts.
            this.fileName = serialized.Substring(0, equalSignPos - 1);
            this.displayName = serialized.Substring(equalSignPos + 1, semiPos - 1);
            // überprüfen wir, was drin steht - man könnte dies, bei längeren enum auch über switch gestalten.
            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.:
ausblenden C#-Quelltext
1:
public class MyClass : TreeNode /*oder*/ 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 21.09.10 10:10 
wie kann ich aus diesem quellcode ein TreeView machen?

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: 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^^
ausblenden volle Höhe 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 hack
                    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)
                    {// add one file for IndexCreator
                        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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: 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
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 22.09.10 13:42 
ich hab hier mal versucht aus meinem quelltext ganz oben ein TreeView einzubauen. klappt aber immer noch nicht :(

ausblenden 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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: 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.:
ausblenden C#-Quelltext
1:
2:
TreeNode n = new TreeNode("name");
n.Tag = new FileInfo("path")/*or*/ 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:
ausblenden C#-Quelltext
1:
2:
3:
if(yourBool)
    treeView.Visible = false;
//code

oder so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if(yourBool)
{
    treeView.Visible = false;
    //code
}



PS: du kannst [ cs ] code [/ cs ] schreiben :o
Ilki Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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?