Search code examples
vb.netvisual-studio-2013savefiledialoggeckofx

SaveFileDialog closes automatically directly after calling showDialog()


I'm using Windows 7 with Visual Studio 2013.

My application is a webbrowser-Component with GeckoFx. At the download-event I trigger to open the SaveFileDialog as follows. But in some cases the dialog disappears directly after callong ShowDialog() and returns a DialogResult.Cancel which jumps into the else-statement, although nobody pressed cancel. No error is thrown.

Any suggestions why this happens here? I've no clue about this ... :-(

        'Save file dialog
        Dim saveFileDialog1 As New SaveFileDialog()

        saveFileDialog1.Filter = "CSV file (*.csv)|*.csv|All files (*.*)|*.*"
        saveFileDialog1.FilterIndex = 2
        saveFileDialog1.RestoreDirectory = True
        saveFileDialog1.FileName = e.Filename
        saveFileDialog1.AutoUpgradeEnabled = False
        saveFileDialog1.CheckPathExists = False
        saveFileDialog1.InitialDirectory = globalParameters.getDownloadDirectory() 'globalParameters._downloadDirectory

        dialogResultValue = saveFileDialog1.ShowDialog()

        If dialogResultValue = DialogResult.OK Then
            'should go on here first, if user presses okay
        Else
            ' I am coming to this point, althoug nobody pressed any cancel button or any other input had happened yet
        End If

Solution

  • Thx for your advises @DannyJames and @ChrisDunaway.

    Somehow I could figure out (with both of my questions and your answers) that the SaveFileDialog.ShowDialog(Me) needs a reference to the Form Me.

    Only then the SaveFileDialog will load properly without errors or even cancels its call without any other user-action.

    Unfortunately I put the download-part into a vb-class that hasn't been inherited by Inherits System.Windows.Forms.Form, so that it hasn't a reference to a Form (which obviously needs to be required).

    I changed my code, so that I have references to forms (so, that I could use the reference to a form, such as Me in form-class). And it works like a charm.

    For completion here's such an example:

    Imports System.IO
    Imports Gecko
    Imports System
    Imports System.Windows.Forms
    Imports System.Drawing.Printing
    Imports System.Management
    Imports System.Threading
    Imports System.Runtime.InteropServices
    Imports System.Timers
    
    Public Class frmMain
    
    ' [...] 
    ' ATTENTION, MORE CODE IS NEEDED TO RUN GECKOFX WITH AN URL BUT NOT DISPLAYED HERE AT THIS POINT, 
    ' SINCE IT ISN'T NEEDED HERE TO SHOW THE ACTUAL PROBLEM
    
    ''' <summary>
    ''' Startup-Functionalities, such as Gecko Xpcom-Start etc.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        ' call initiliazer
        InitializeComponent()
        AddHandler Gecko.LauncherDialog.Download, AddressOf Me.LauncherDialog_Download
    End Sub
    
    ''' <summary>
    ''' see also
    ''' http://quabr.com/19906621/how-to-handle-downloads-on-gecko15-with-mozilla-xul15-in-visual-basic
    ''' or
    ''' http://stackoverflow.com/questions/19906621/how-to-handle-downloads-on-gecko15-with-mozilla-xul15-in-visual-basic
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Public Sub LauncherDialog_Download(ByVal sender As Object, ByVal e As Gecko.LauncherDialogEvent)
    
        Try
            Dim P As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & Path.DirectorySeparatorChar & "tmp" 'globalParameters._downloadDirectory '
            If Not System.IO.Directory.Exists(P) Then System.IO.Directory.CreateDirectory(P)
    
            Dim objTarget As nsILocalFile = Xpcom.CreateInstance(Of nsILocalFile)("@mozilla.org/file/local;1")
    
            Using tmp As New nsAString(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + vbTab & "temp.tmp")
                objTarget.InitWithPath(tmp)
            End Using
    
            If globalParameters._doNotShowDownloadPrompt Then
                'only if user does not want to load saveFileDialog; not interesting at this point
            Else
                'Save file dialog
                Dim saveFileDialog1 As New SaveFileDialog()
                saveFileDialog1.Filter = "CSV file (*.csv)|*.csv|All files (*.*)|*.*"
                saveFileDialog1.FilterIndex = 2
                saveFileDialog1.RestoreDirectory = False
                saveFileDialog1.FileName = e.Filename
                saveFileDialog1.AutoUpgradeEnabled = False
                saveFileDialog1.CheckPathExists = False
                saveFileDialog1.InitialDirectory = globalParameters.getDownloadDirectory() 'globalParameters._downloadDirectory
    
                Dim dialogResultValue As DialogResult
                Try
                    dialogResultValue = saveFileDialog1.ShowDialog(Me)
                Catch ex As Exception
                    logging.logInformation("Probleme beim laden des Dialogs: " & ex.ToString())
                End Try
    
                If dialogResultValue = DialogResult.OK Then
                    Try
                        Dim par As New Parameters
                        par.sender = sender
                        par.e = e
                        par.mime = e.Mime
                        par.url = e.Url
                        par.fileName = saveFileDialog1.FileName
                        par.dialogResultValue = dialogResultValue
                        par.myStream = saveFileDialog1.OpenFile()
                        modMain.ThreadJob(par)
                    Catch ex As Exception
                        logging.logInformation("Error during loading File" & e.ToString)
                    End Try
                End If
            End If
    
        Catch ex As Exception
            logging.logInformation("Error during loading File" & ex.ToString)
        Finally
            ' nothing to to here
        End Try
    End Sub
    
    
    Private Sub frmMain_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
        RemoveHandler Gecko.LauncherDialog.Download, AddressOf Me.LauncherDialog_Download
    End Sub
    End Class
    

    I hope I could describe the problem properly for other people searching this problem