Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 17.04.15 19:06 
Hallo Leute. Ich habe eine ListView auf der Form1. Wenn ich den Button "Importieren..." klicke, dann werden alle Order aus dem ausgewählten Ordner (FileBrowserDialog) in der ListBox angezeigt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 FolderBrowserDialog folder1 = new FolderBrowserDialog();
if(folder1.ShowDialog()==DialogResult.OK)
{
    listBox1.Items.Clear();
    string[] files = Directory.GetFiles(folder1.SelectedPath);
    string[] dirs = Directory.GetDirectories(folder1.SelectedPath);

    foreach (string s in files)
    {
        this.listBox1.Items.Add(Path.GetFileName(s));
    }

    foreach (string p in dirs)
    {
        this.listBox1.Items.Add(Path.GetDirectoryName(p));
    }
}

Wenn ich nun ein Item auswähle, dann soll in eine RichTextBox (als Vorschau)mit den sich darin befindenen Daten befüllt werden. Ich denke, dann geschieht über das SelectedIndexChanged- Event. In der ListBox befinden sich die HTML- Scripte. Wenn man einen auswäht, dann soll in der RichTextBox der Script selbst angezeigt werden. Die Scripts selber, speichere ich so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
SaveFileDialog save = new SaveFileDialog();
if(save.ShowDialog()==DialogResult.OK)
{
 this.richTextBox1.SaveFile(save.FileName, RichTextBoxStreamType.PlainText);
}

Danke schonmal im Vorraus. :)

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 17.04.15 19:52 
Anstatt Directory würde ich eher die Klassen entsprechend DirectoryInfo benutzten da kann man Files und Directories einfacher gleich behandeln und du solltest nicht nur den Namen in die ListBox schreiben sondern das ganze Object dann hast du auch nachher die ganzen Details die du sicher brauchst um das File/Directory auch wirklich zu identifizieren.

Beispiel in dem ich DoubleClick verwendet habe anstatt SelectedIndexChanged. Wenn man Verzeichnisse anzeigt will man auch navigieren und das ist blöd wenn das sofort passiert wenn man nur zufällig drüber scrollt.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private void FillListBoxWithDirectoryContent(DirectoryInfo dirInfo)
{
    // ich habe eine BindingSource auf die Form geworfen dann läßt sich einfacher an die ListBox binden, bindingSource hat eine Current Property für die aktuelle Auswahl.
    bindingSource1.DataSource = dirInfo.GetFileSystemInfos();
    listBox1.DataSource = bindingSource1; // diese beiden Zeilen nur zur veranschaulichung DataSource/DisplayMember läßt sich viel leichter über den Designer binden.
    listBox1.DisplayMember = "Name";        
}

private void listBox1_DoubleClick(object sender, EventArgs e)
{
    FileSystemInfo fileOrDir = bindingSource1.Current as FileSystemInfo;
    if (fileOrDir != null)
    {
        if (fileOrDir is FileInfo)  // ist ein File -> anzeigen
            richTextBox1.Text = ((FileInfo)fileOrDir).OpenText().ReadToEnd();

        if (fileOrDir is DirectoryInfo)  // ist ein Ordner -> öffnen 
            FillListBoxWithDirectoryContent((DirectoryInfo)fileOrDir);
         
    }
}


In einer ListBox anzeige wäre dann noch eine vernünftige Sortierung zu erledigen, irgendwie Files von Directories unterscheidbar machen. Und wenn man navigieren möchte müßte man noch einen Eintrag zaubern um zurück zu navigieren in den Parent Ordner.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 18.04.15 11:27 
Ich habe auf die Form1 eine BindingSource geworfen und Ihren Code abgetippt. Es passiert nichts, wenn man ein Item klickt bzw. doppelklickt. Es wird von VisualStudio zwar kein Fehler im Code selbst gefunden, aber die RichTextBox bleibt bei jeden Item leer. MFG :)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 18.04.15 12:00 
Du mußt natürlich das Ereignis noch abonnieren:
ausblenden C#-Quelltext
1:
listBox1.DoubleClick += listBox1_DoubleClick;					

(oder aber im VS unter Eigenschaften/Ereignisse (der gelbe Pfeil) die Zuweisung vornehmen)
Das solltest du aber inzwischen wissen...
Ansonsten den Debugger bemühen.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 18.04.15 12:59 
Also ich habe das Ereignis jetzt hinzugefügt und es passiert immer noch nichts. Mein Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
private void listBox1_DoubleClick(object sender, EventArgs e)
        {
            FileSystemInfo info = bindingSource1.Current as FileSystemInfo;
            if(info != null)
            {
                if (info is FileInfo)
                    richTextBox1.Text = ((FileInfo)info).OpenText().ReadToEnd();
                if (info is DirectoryInfo)
                    FillListBox((DirectoryInfo)info);
            }

            this.listBox1.DoubleClick += listBox1_DoubleClick;
        }

MFG :D

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 18.04.15 13:06 
Wie soll die untere Codezeile denn ausgeführt werden, wenn die Methode selbst nicht ausgeführt wird. Du mußt diese Codezeile selbstverständlich vorher ausführen lassen (am besten im Konstruktor).

PS: Und bitte verwende demnächst selber die C#-Tags (wie ich dir in der PN geschrieben habe): [cs]...[/cs]
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 18.04.15 13:18 
Könnten Sie mir bitte ein Beispiel senden, wo man dass Ereignis abboniert? Ein ganz kurzes reicht ja.

PS: Ich weiß nicht, wo man die Tags hinzufügt. LG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 18.04.15 15:50 
Im Konstructor deiner Form, in der steht schon der Aufruf von InitializeComponent(), kannst du da drunter die Ereignisse registrieren und einmal die FillListBoxWithDirectoryContent Methode mit irgendwas aufrufen um die ListBox mit irgendwas initial zu füllen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public MeinLieberFormName() // den richtigen Namen der Form verwenden!!!
{
    InitializeComponent();
    listBox1.DoubleClick += listBox1_DoubleClick;
    FillListBoxWithDirectoryContent(new DirectoryInfo(@"D:\")); 
}