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
CustomFileDialog
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

CustomFileDialog

beantworten | zitieren | melden

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.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

CustomDrawnFileDialog

beantworten | zitieren | melden

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.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

Neuere Version

beantworten | zitieren | melden

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
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

hier ein screenshot:
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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

Zuletzt kommt noch diese Ansicht hinzu:
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
MagicAndre1981
myCSharp.de - Member

Avatar #avatar-2623.jpg


Dabei seit:
Beiträge: 913
Herkunft: Nordhausen

beantworten | zitieren | melden

Mal 'ne Frage. Warum bastelst du was neu, was es schon lange gibt?
private Nachricht | Beiträge des Benutzers
progger
myCSharp.de - Member

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1334
Herkunft: Nähe von München

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Resourcen eingebettet und InitialDirectory korrigiert.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

PreviewFileDialog basierend auf OpenFileDialog (OpenFileName)

beantworten | zitieren | melden

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

S
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Screenshot:
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

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.
Zitat
nichts gscheides raus
Was bedeutet das konkret? Exceptions?
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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
Attachments
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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:
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von steffen_dec am .
Attachments
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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
                }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von steffen_dec am .
Attachments
private Nachricht | Beiträge des Benutzers