Laden...

CustomFileDialog

Letzter Beitrag vor 16 Jahren 17 Posts 21.464 Views
CustomFileDialog

EDIT: im aktuellsten Post könnt ihr euch jetzt einen nachprogrammierten FileDialog downloaden.

Beim FileDialog stört es, dass man keinen ViewStyle für die ListView auswählen oder die Größe und die Position nicht verändern kann.

Deswegen habe ich diesen Wrapper gemacht.

Da ich es nicht hinbekomme ein Preview einzubauen momentan,
vielleicht postet ja hier jemand wie man das hinbekommen könnte...

Der Aufruf geschieht folgendermaßen:

        fileDialog.SetBounds(new Rectangle(0, 0, 10110, 11100));  
        TextBox tb = new TextBox();  
        tb.Location = new Point(100, 100);  
        tb.Dock = DockStyle.Fill;  
        fileDialog.Controls.Add(tb);  
        fileDialog.ShowDialog();  

zudem muss in der Form von der der FileDialog aufgerufen wird,


        protected override void WndProc(ref Message m)
        {
            fileDialog.WndProc(ref m);
            base.WndProc(ref m);
        }

geschrieben werden, sonst funktioniert das ganze nicht...

über FileDialog.Controls.Add(Control) können alle CSharp-Controls hinzugefügt werden.

z.B.


TextBox tb = new TextBox();
tb.Dock = DockStyle.Fill;
tb.Location = new Point(10,10);
FileDialog.Controls.Add(tb);

der Bezugspunkt von Location ist immer die Linke/Obere Ecke des FileDialogs.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

CustomDrawnFileDialog

So, da selbst mit dem Subclassing und Hooks des FileDialogs Grenzen gesetzt sind,
habe ich jetzt einen eigenen FileDialog begonnen zu machen, den ich für meine Anwendung brauche.

Es fehlt zwar noch viel aber ich habe beschlossen ihn trotzdem zu posten, dann können noch Wünsche einfließen.

Was noch reinkommen wird, sind alle Properties von der .NET-FileDialog-Klasse

  • ein Preview (ist schon drin, funktioniert aber noch nicht richtig)
  • evtl. eine TreeView, falls gewünscht

Was fehlt noch?

Einiges.

  • ComboBox für Suchen in funktioniert noch nicht.
  • AutoVervollständigen für cobFileName wie im Windows-FileDialog fehlt noch
  • Mehrfachauswahl hat noch Fehler...
  • Optimierung (Threading) für Laden der Strukturen
  • FileInfo mit Größe, Schreibgeschützt usw.
  • Ansichten umschalten
  • Detailliste

uvm.

Was geht schon?

  • Dateinamen anklicken und übernehmen
  • DialogResult abfragen
  • Ordnernamen in cobFileName eintippen und durch Return/Öffnen direkt in dieses Verzeichnis gehen.

momentan ist dies das ganze projekt zum ausprobieren.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Neuere Version

So, vorerst die neueste Version:

Ach ja, die Icons werden natürlich auch noch geändert und es kommt noch ein DropDownButton oben rechts rein

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

hier ein screenshot:

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Letztes update für heute:

die linke Seite (bis auf Netzwerkumgebung) funktioniert jetzt auch.

EDIT: Neue Version. Kleine Fehler korrigiert, kann jetzt auch ohne Icons aufgerufen werden.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Die nächste Version erscheint erst, wenn alle Icons richtig sind, und das Programm fertig getestet ist.

Zuletzt kommt noch diese Ansicht hinzu:

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Mal 'ne Frage. Warum bastelst du was neu, was es schon lange gibt? 🤔

Hat er doch oben geschrieben.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

EDIT: @MagicAndre1981

Z.B. weil es für viele schwer ist in C# einen Hook für den FileDialog zur Dateivorschau zu implementieren. Ist doch ein Grund...

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Resourcen eingebettet und InitialDirectory korrigiert.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

PreviewFileDialog basierend auf OpenFileDialog (OpenFileName)

Zum später kommenden Artikel hier schon mal die Komponente:

S

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Hallo dr4g0n76,

ich muss deinen Beitrag rausholen 😁

Ich benutze in meinem Programm den Standard-OpenFileDialog/SaveFileDialog.

Nun möchte ich den Zugriff auf bestimmte Laufwerke (z.b. C:\ und D:) zur Laufzeit (Benutzerabhängig) sperren.

Dass geht ja mit den windowseigenen Mitteln leider nicht... Deshalb brauche ich einen eigenen Dialog oder?

Vielleicht hast du ja eine Idee? Du hast dich ja mit dem FileDialog beschäftigt...

Ich habe auch deinen nachgebauten Dialog (customFileDialog) getestet, irgendwie kommt bei mir nichts gscheides raus. Hast du vielleicht ein Demo Projekt wo dieser verwendet wird?

Ich möchte mit dem Dialog erreichen dass bestimmte Benutzer (Programminterne Benutzer) am Dateisystem nicht manipulieren sondern z.b. eine Datei (Backup) abspeichern können (ggf auch auf einem USB-Datenträger).

Ich danke dir im Voraus für deine Zeit 🙂

Viele Grüße
Steffen

Hallo steffen_dec,

deine Frage wäre eigentlich schon einen eigenen Thread wert

Bestimmte Ordner / Dateien für den User über den OpenFileDialog bzw. SaveFileDialog vor Veränderungen zu schützen ist IMHO keine gute Idee - prüfen lieber nach Auswahl der Datei/des Ordners, ob der Zugriff erlaubt ist. Noch besser wäre sogar, Windows-Eigene Mittel zu nutzen, um bestimmten Computerbenutzern die Schreibrechte für einen Ordner zu entziehen - dann kann wirklich nichts schief gehen.

nichts gscheides raus

Was bedeutet das konkret? Exceptions?

Hallo,

ich möchte in dem Filedialog entweder bestimmte Laufwerke gar nicht anzeigen. oder die Windows-Funktionalitäten (wie kopieren, löschen, ausschneiden, erstellen usw) deaktivieren bzw. abfangen.

Windowseigene mittel kommen nicht in Frage da ich vom Programm aus überall Zugriff brauche. Die Benutzer unterscheide ich bei mir im Programm intern (eigene Benutzerverwaltung).

ich habe das control von dr4g0n76 ausprobiert und auf einer Form aufgezogen dann sieht es so aus wie auf dem Bild (auch zur Laufzeit)

Vielleicht kennt ja jemand ein anderes FileDialog welchen man anpassen kann. Sonst muss ich wohl oder übel das Rad neu erfinden 😁

Danke
Steffen

ich habe nun einen eigenen Dialog angefangen.

falls es jemand mal braucht stelle ich es hier dann rein wenn ich es komplett fertig habe.

so sieht z.b. ein Aufruf aus:


            FolderDialog folderDialog = new FolderDialog();
            
            //Filter für Dateitypenliste
            folderDialog.Filter = "Image Files(*.BMP;*.JPG)|*.BMP;*.JPG|All Files(*.*)|*.*";
            //Standarderweiterung (Wenn keine angegeben wird)
            folderDialog.DefaultExt = ".bmp";
            //Start Verzeichnis
            folderDialog.InitialDirectory = "D:\\Images";
            //Default Dateiname
            folderDialog.FileName = "testbild";
            //Titel des Dialogs
            folderDialog.Title = "Save As";

            DialogResult drResult = folderDialog.ShowDialog();
            if (drResult == DialogResult.OK)
            {
                txtInput.Text = folderDialog.FullFileNamePath;
            }

hier ein screenshot:

Also hier der Dialog.

dieser beinhaltet keine Windows-Funktionen wie Kopieren, Einfügen, Löschen usw.. (Kontextmenü). Dass habe ich mit Absicht so gemacht, damit keine Daten manipuliert werden können.

und so wird der Dialog verwendet:


                FolderDialog folderDialog = new FolderDialog();
                folderDialog.OverwritePrompt = false;

                //Filter für Dateitypenliste
                folderDialog.Filter = "ZIP-File (*.zip)|*.zip|SQL-File (*.sql)|*.sql";

                //Standarderweiterung (Wenn keine angegeben wird)
                folderDialog.DefaultExt = ".zip";

                //Start Verzeichnis
                if (Directory.Exists("E:\\"))
                    folderDialog.InitialDirectory = "E:\\";
                else
                    folderDialog.InitialDirectory = "D:\\";

                //Titel des Dialogs
                folderDialog.Title = "Rücksicherung der Datenbank";
                //folderDialog.DenyDrives = "C";

                DialogResult dRes = folderDialog.ShowDialog();

                if (dRes == DialogResult.OK)
                {
                     //Weiter verarbeiten
                }