SaveFileDialog FileOK-Event feuert nicht.

  • C#
  • .NET (FX) 4.0

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von BeatsleigherXDA.

    SaveFileDialog FileOK-Event feuert nicht.

    Hallo,

    für die Backup-Funktionen von BukkitUI (for Win32) habe ich eine SaveFileDialog, damit man als Benutzer sich den Speicherort aussuchen kann.

    Jedoch feuert das FileOK-Event nicht:

    C#-Quellcode

    1. private void button2_Click(object sender, EventArgs evt) {
    2. SaveFileDialog saveDialog = new SaveFileDialog();
    3. saveDialog.CheckPathExists = true;
    4. saveDialog.FileName = Path.Combine(backupDir,
    5. new Bukkit.ServerProperties(Properties.Settings.Default.bukkitDir, false).levelName + "_backup-" + DateTime.Now.ToFileTimeUtc() + ".mwb");
    6. saveDialog.Filter = "Minecraft World Backup Files|*.mwb|Zip Files|*.zip";
    7. saveDialog.FilterIndex = 0;
    8. saveDialog.OverwritePrompt = true;
    9. saveDialog.ShowHelp = true;
    10. saveDialog.SupportMultiDottedExtensions = true;
    11. saveDialog.Title = "Select Location to Backup World To...";
    12. saveDialog.HelpRequest += (s, e) => MessageBox.Show(this,
    13. "This dialog allows you to select a specific location on your hard drive, where the server's world(s) will be backed up.\n"
    14. + "If you are unsure where to save the world backup or what to name it or want to be able to have it restored automatically,\n"
    15. + "please leave the preferences as-is. If your backup is not saved in the default location, BukkitUI might not detect it.",
    16. "BukkitUI World Backup Help", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    17. saveDialog.FileOk += (s, e) => {
    18. MessageBox.Show(this, "Hello!"); // Um zu schauen, ob das Event feuert
    19. LoadingForm loader = new LoadingForm();
    20. loader.Show();
    21. loader.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
    22. loader.progressBarStyle = ProgressBarStyle.Marquee;
    23. loader.statusText = "Preparing to back up...";
    24. };
    25. saveDialog.ShowDialog();
    26. }


    Habt ihr eine Idee, woran das liegen könnte? Ich habe es als Stand-a-lone-Methode auch versucht, geht auch nicht.

    Danke im Voraus!
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    Is zwar VB aber ...

    Visual Basic-Quellcode

    1. If savefiledialog.show = System.Windows.Forms.DialogResult.OK then
    2. MsgBox("bla")
    3. End if


    Du musst den Dialog erst aufrufen, bevor du abfragst, ob OK gedrückt wurde

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kilian_98“ ()

    Kilian_98 schrieb:

    Du musst den Dialog erst aufrufen, bevor du abfragst, ob OK gedrückt wurde


    BeatsleigherXDA schrieb:

    saveDialog.ShowDialog();


    Der Dialog wird aufgerufen.
    Ich möchte aber lieber das FileOK-Event nehmen, da eine Abfrage manchmal unübersichtlicher ist, und da ich das HelpRequest-Event auch schon mit Lambdas gemacht habe, und das auch funktioniert, gehe ich davon aus, dass es mit FileOK ja auch funktionieren muss.

    Edit:
    Das hier wäre der gleiche Code in VB. Vielleicht verstehst du es dann besser :)

    VB.NET-Quellcode

    1. Private Sub button2_Click(sender As Object, evt As EventArgs)
    2. Dim saveDialog As New SaveFileDialog()
    3. saveDialog.CheckPathExists = True
    4. saveDialog.FileName = Path.Combine(backupDir, New Bukkit.ServerProperties(Properties.Settings.[Default].bukkitDir, False).levelName + "_backup-" + DateTime.Now.ToFileTimeUtc() + ".mwb")
    5. saveDialog.Filter = "Minecraft World Backup Files|*.mwb|Zip Files|*.zip"
    6. saveDialog.FilterIndex = 0
    7. saveDialog.OverwritePrompt = True
    8. saveDialog.ShowHelp = True
    9. saveDialog.SupportMultiDottedExtensions = True
    10. saveDialog.Title = "Select Location to Backup World To..."
    11. saveDialog.HelpRequest += Function(s, e) MessageBox.Show(Me, "This dialog allows you to select a specific location on your hard drive, where the server's world(s) will be backed up." & vbLf + "If you are unsure where to save the world backup or what to name it or want to be able to have it restored automatically," & vbLf + "please leave the preferences as-is. If your backup is not saved in the default location, BukkitUI might not detect it.", "BukkitUI World Backup Help", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
    12. saveDialog.FileOk += Function(s, e)
    13. MessageBox.Show(Me, "Hello!")
    14. Dim loader As New LoadingForm()
    15. loader.Show()
    16. loader.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
    17. loader.progressBarStyle = ProgressBarStyle.Marquee
    18. loader.statusText = "Preparing to back up..."
    19. End Function
    20. saveDialog.ShowDialog()
    21. End Sub

    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    VB.NET-Quellcode

    1. loader.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
    2. loader.progressBarStyle = ProgressBarStyle.Marquee
    3. loader.statusText = "Preparing to back up..."
    4. End Function
    5. saveDialog.ShowDialog()
    6. End Sub



    versuch dein saveDialog.ShowDialog() mal über das FileOK Event zu packen :

    VB.NET-Quellcode

    1. saveDialog.ShowDialog()
    2. saveDialog.FileOk += Function(s, e)
    3. MessageBox.Show(Me, "Hello!")
    4. Dim loader As New LoadingForm()
    5. loader.Show()
    6. loader.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
    7. loader.progressBarStyle = ProgressBarStyle.Marquee
    8. loader.statusText = "Preparing to back up..."
    9. End Function
    10. End Sub


    #Edit du müsstest natürlich auch die Loading form nach oben verschieben :)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Hm, ich muss gestehen, dass ich das so noch nie gemacht habe, ich mach es immer so wie oben beschrieben,
    das funzt immer. Wenn ich das aber richtig sehe, wird erst abgefragt, ob OK gedrückt wurde und dann wird der Ofd
    geöffnet.

    EDIT:

    Linkai schrieb:

    versuch dein saveDialog.ShowDialog() mal über das FileOK Event zu packen :

    Das mein ich


    genau das :D das Programm arbeitet von oben nach unten

    was zuerst kommt, wird zuerst ausgeführt deshalb mein TIPP:

    VB.NET-Quellcode

    1. ​ saveDialog.FileOk += Function(s, e)
    2. MessageBox.Show(Me, "Hello!")
    3. Dim loader As New LoadingForm()
    4. loader.Show()
    5. loader.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
    6. loader.progressBarStyle = ProgressBarStyle.Marquee
    7. loader.statusText = "Preparing to back up..."
    8. End Function
    9. saveDialog.ShowDialog()
    10. End Sub


    Austauschen gegen:

    VB.NET-Quellcode

    1. Dim loader As New LoadingForm()
    2. 'Die Eigenschaften würde ich auch vorher setzen :)
    3. loader.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
    4. loader.progressBarStyle = ProgressBarStyle.Marquee
    5. loader.statusText = "Preparing to back up..."
    6. loader.Show()
    7. saveDialog.ShowDialog()
    8. saveDialog.FileOk += Function(s, e)
    9. MessageBox.Show(Me, "Hello!")
    10. End Function
    11. End Sub
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

    Linkai schrieb:

    versuch dein saveDialog.ShowDialog() mal über das FileOK Event zu packen :


    Das funktioniert so nicht. Wenn du das Dialog schon aufgerufen hast, kannst du keine Events mehr hinzufügen o.ä.

    So wie ich es geschrieben habe, ist es genau so als würde ich folgendes schreiben:

    C#-Quellcode

    1. private SaveFileDialog saveFileDialog;
    2. public <ClassName> {
    3. saveFileDialog.FileOK += saveFileDialog_onOK;
    4. }
    5. private void saveFileDialog_onOK(object sender, EventArgs evt) {
    6. MessageBox.Show(this, "Hello");
    7. }
    8. private void button1_onClick(object sender, EventArgs evt) {
    9. saveFileDialog.ShowDialog();
    10. }


    Das ist genau das Gleiche, wie mit Button-Events. DIe Events werden IMMER vor dem Feuern an sich erstellt.
    Siehe:
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    @BeatsleigherXDA Arbeite mal so mit Dialogen:

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. using (SaveFileDialog dlg = new SaveFileDialog())
    4. {
    5. dlg.Filter = "Minecraft World Backup Files|*.mwb|Zip Files|*.zip";
    6. // andere Einstellungen
    7. if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
    8. {
    9. return;
    10. }
    11. // hier ist mit Sicherheit OK gedrückt worden.
    12. MessageBox.Show(dlg.FileName);
    13. }
    14. }

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Scheint wohl so, als hätte ich keine andere Wahl. FileOK ist wohl schon länger kaputt, gibt ganz viele die das aus unerklärlichen Gründen nicht verwenden können.

    #HereComesTheUglyCode.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    @BeatsleigherXDA: Arbeite mal so mit Dialogen: Zieh sie dir aufs Form, richte sie ein, und setze nur im Konstruktor die letzten notwendigen Einstellungen (etwa InitialDirectory).
    Erstelle nicht andauernd neue Instanzen, die das zuvor vom User eingegebene dann immer wieder vergessen haben.
    Das FileOk-Event finde ich unnötig, denn .ShowDialog wartet doch, bis die Eingabe beendet, umd direkt im Anschluss daran verarbeite die Eingabe: Teste das DialogResult, und wenn ok, mach iwas mittm eingestellten Pfad.
    Mittm HelpDingens-Event isses anners, das musste halt ordentlich abonnieren.

    ErfinderDesRades schrieb:

    Zieh sie dir aufs Form, richte sie ein, und setze nur im Konstruktor die letzten notwendigen Einstellungen (etwa InitialDirectory).


    Normalerweise stimme ich Dir bei sowas zu, wenn der Dialog mehrmals verwendet wird, aber da der hier nur einmal verwendet wird, sich die Form dann kurzerhand schließt und das Programm weiterläuft, wäre es unnötig; besser so, denn so kann es schneller vom GC verwertet werden.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    Ja, schon klar, aber so geht es schneller.

    Ich habe ja gewisse Gründe, warum ich manche Sachen so mache, wie ich sie mache.

    Auch wenn sie manchmal falsch rüber kommen, im Großen und Ganzen macht es Sinn.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln