2016-08-12 2 views
0

Vous essayez d'écrire du code pour récupérer le chemin du fichier afin qu'il puisse être utilisé plus tard dans une fonction ReadFile(), mais rencontre quelques problèmes.Implémentation de la fonctionnalité du bouton Réessayer sur les problèmes MessageBox (C#)

Mon but est d'implémenter un MessageBox qui génère un message d'erreur avec un bouton de réessai et de fermeture fonctionnant tous les deux fonctionnellement. Lorsque le code suivant est exécuté, il boucle simplement le bloc try et n'entre jamais dans le bloc catch, ce que je veux faire quand je ne sélectionne pas un fichier ou que je clique sur cancel sur OpenFileDialog.

est Ci-dessous le code que je suis actuellement en utilisant ..

public static string GetFile() { 
    MyLog.Write(@"Begin OpenFileDialog Process", LogFormat.Evaluate); 
    var path = _lastFilePath != string.Empty ? _lastFilePath : GetBaseDirectory(); 
    if (path == null || !Directory.Exists(path)) 
     path = Assembly.GetExecutingAssembly().CodeBase; 

    var dialog = new OpenFileDialog { 
     InitialDirectory = path, 
     Filter = @"Text|*.txt|All|*.*", 
     RestoreDirectory = true 
    }; 

    var result = DialogResult.Retry; 
    while (result == DialogResult.Retry) { 
     try { 
      if (dialog.ShowDialog() != DialogResult.OK) { 
       MyLog.Write(@"File Retrieval was Unsuccessful", LogFormat.Result); 
      } else { 
       MyLog.Write($"FilePath: {dialog.FileName}", LogFormat.Process); 
       MyLog.Write(@"File Retrieval was Successful", LogFormat.Result); 
       _lastFilePath = Path.GetDirectoryName(dialog.FileName); 
       return dialog.FileName; 
      } 
     } catch when (result == DialogResult.Retry) { 
      MyLog.Write("No File Selected", LogFormat.Error); 
      result = MessageBox.Show(@"Please select a file..", @"No File Selected!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation); 
      if (result == DialogResult.Abort) throw; 
      return null; 
     } 
    } 
    return null; 
} 

J'ai essayé d'adapter le code à un similar question, mais je suis mal à comprendre pourquoi la logique ne fonctionne pas dans mon contexte.

Ce que je fais incorrectement?

EDIT: à l'aide de la réponse d'Ephraïm, j'ai pu trouver ce qui suit qui semble fonctionner ..

// USED TO RETRIEVE THE FILENAME IN A OPENFILEDIALOG 
public static string GetFile() { 
    MyLog.Write(@"Begin OpenFileDialog Process", LogFormat.Evaluate); 
    var path = _lastFilePath != string.Empty ? _lastFilePath : GetBaseDirectory(); 
    if (path == null || !Directory.Exists(path)) 
     path = Assembly.GetExecutingAssembly().CodeBase; 

    var dialog = new OpenFileDialog { 
     InitialDirectory = path, 
     Filter = @"Text|*.txt|All|*.*", 
     RestoreDirectory = true 
    }; 

    var result = DialogResult.Retry; 
    while (result == DialogResult.Retry) { 
     if (dialog.ShowDialog() != DialogResult.OK) { 
      MyLog.Write(@"File Retrieval was Unsuccessful", LogFormat.Result); 
      MyLog.Write("No File Selected", LogFormat.Error); 
      result = MessageBox.Show(@"Please select a file..", @"No File Selected!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation); 
      if (result == DialogResult.Abort || result == DialogResult.Cancel) { break; } 
      if (result == DialogResult.Retry) { return GetFile(); } 
     } 

     MyLog.Write($"FilePath: {dialog.FileName}", LogFormat.Process); 
     MyLog.Write(@"File Retrieval was Successful", LogFormat.Result); 
     _lastFilePath = Path.GetDirectoryName(dialog.FileName); 
     return dialog.FileName; 
    } 
    return null; 
} 
+0

Avez-vous le mettre dans un débogueur? – DWright

+0

L'instruction 'catch' ne se déclenche jamais car aucune exception n'est levée dans la section' try'. – Aaron

Répondre

1

Vous n'avez pas besoin d'effectuer un try-catch dans votre cas depuis aucune exception n'est levée ou interceptée lorsque l'utilisateur ne sélectionne rien à l'aide de la boîte de dialogue de fichier.

Essayez:

while (result == DialogResult.Retry) { 
     if (dialog.ShowDialog() != DialogResult.OK) { 
       MyLog.Write(@"File Retrieval was Unsuccessful", LogFormat.Result); 
       MyLog.Write("No File Selected", LogFormat.Error); 
      result = MessageBox.Show(@"Please select a file..", @"No File Selected!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation); 
       if (result == DialogResult.Abort) throw; 
        return null; 
      } else { 
       MyLog.Write($"FilePath: {dialog.FileName}", LogFormat.Process); 
       MyLog.Write(@"File Retrieval was Successful", LogFormat.Result); 
       _lastFilePath = Path.GetDirectoryName(dialog.FileName); 
       return dialog.FileName; 
      } 
    } 
+0

Juste essayé ceci. Il semble maintenant exécuter le code dans le bloc catch, mais ce n'est toujours pas 100%. Comment puis-je ajouter des fonctionnalités au bouton Réessayer sur le MessageBox? Il ne fait rien actuellement. – TheAuzzieJesus