Je veux rechercher un dossier dans un script LINQPad, j'ai donc essayé d'utiliser FolderBrowserDialog. Ça n'a pas marché.

Voici un extrait montrant ce que je fais?

string path = "";
var browser = new FolderBrowserDialog { ShowNewFolderButton = false };
if (browser.ShowDialog() == DialogResult.OK)
{
    path = browser.SelectedPath;
}

Cela s'exécute et se bloque sur la ligne avec ShowDialog () avec le pointeur d'exécution jaune sur cette ligne, mais la boîte de dialogue du navigateur de dossier n'est pas visible.

Je sais qu'il y a une surcharge pour ShowDialog () qui prend un argument IWin32Window owner et j'ai pensé que cela pourrait être la solution, mais je n'ai pas encore compris comment obtenir un IWin32Window pour la fenêtre principale LINQPad. J'espérais que la classe Util pourrait fournir un moyen mais à moins que je ne le manque, cela ne semble pas le faire.

Quelqu'un a-t-il des conseils pour contourner ce problème?

1
Steve Crane 2 janv. 2016 à 13:55

3 réponses

Meilleure réponse

La définition de l'option Run each query in its own process sur true est la cause du problème. La définition de cette option sur la valeur par défaut false permet au code décrit ci-dessus de s'exécuter comme prévu.

Cependant, effectuer cette modification désactive le débogage intégré. De plus, le comportement est encore légèrement problématique.

Lors de la première exécution du script, la boîte de dialogue s'affiche et le script s'exécute jusqu'à la fin après avoir sélectionné Ok ou Annuler. Cependant, lors de la deuxième exécution du script, il se bloque comme décrit dans la question. Une fois l'exécution annulée et exécutée à nouveau, la boîte de dialogue s'affiche, mais l'heure suivante, elle se bloque à nouveau, et ainsi de suite.

Il a été souligné que la définition de l'option Always use fresh application domains peut résoudre ce problème et c'est le cas, permettant à la boîte de dialogue de s'afficher à chaque exécution du script.

2
Steve Crane 2 janv. 2016 à 13:17

Pas de solution, mais une alternative, le contrôle FilePicker (qui fait partie des nouveaux contrôles d'entrée LinqPad).

Tu peux écrire:

new FilePicker().Dump().TextInput += (x, e) => ((FilePicker)x).Text.Dump();

Ou:

var picker = new FilePicker();
picker.TextInput += (x, e) => {
    var fileName = picker.Text;
    //action with the file...
};

Exemple complet:

void Main()
{
    new FilePicker().Dump().TextInput += (x, e) => procces(((FilePicker)x).Text);
}

void procces(string file)
{
    file.Dump("chosen file...");
    //...
}

enter image description here

1
dovid 26 août 2020 à 09:43

Je viens de rencontrer ce problème avec LINQPad 5. J'avais besoin d'un sélecteur de dossier similaire au sélecteur de fichiers. Votre solution a fonctionné sans que je doive modifier les paramètres LINQPad5. Le problème était que le dialogue restait en arrière-plan. Voici donc comment j'ai fait fonctionner votre extrait de code avec cette boîte de dialogue au point. Au lieu d'utiliser le FolderBrowseDialog.ShowDialog (), j'ai utilisé la surcharge qui passe dans un formulaire Windows. J'ai créé un nouveau formulaire avec la description et la position de la fenêtre, puis je l'ai transmis à ShowDialog. Cela m'a permis de définir la description et le positionnement de la fenêtre.

string path = "";
using ( var browser = new System.Windows.Forms.FolderBrowserDialog { ShowNewFolderButton = false })
{
    browser.Description = "Select Folder For Foo Processing";
    var form = new System.Windows.Forms.Form(){TopMost = true, TopLevel = true};
    var result = browser.ShowDialog(form); 
    if (result == System.Windows.Forms.DialogResult.OK)
    {
        path = browser.SelectedPath;            
    }       
}   
path.Dump();

J'ai essayé d'initialiser le formulaire dans ShowDialog avec les paramètres, mais j'ai eu des problèmes, j'ai donc choisi de le déclarer avant la boîte de dialogue d'affichage. J'espère que cela aide n'importe qui avec ce problème.

0
Charles Byrne 18 août 2019 à 19:02