2009-05-07 5 views
0

J'écris un programme de console qui peut accepter de 1 à 3 fichiers. J'utilise OpenFileDialog trois fois pour accepter les fichiers, mais la deuxième et troisième fois que la boîte de dialogue de fichier est derrière la fenêtre de la console, ce qui rend difficile à remarquer. Un moyen de l'obtenir apparaître ci-dessus?Faire les deuxième et troisième OpenFileDialog apparaissent au-dessus de la console dans .NET/C#?

Une image du problème:

enter image description here

Le code correspondant est:

static bool loadFile(ref List<string> ls) 
{ 
    OpenFileDialog f = new OpenFileDialog(); 
    if (f.ShowDialog() == DialogResult.OK) 
    { 
     Console.WriteLine("Loaded file {0}", f.FileName); 
     ls.Add(f.FileName); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

[STAThread] 
static void Main(string[] args) 
{ 
    // sanity check 
    if (args.Length > 3) 
    { 
     Console.WriteLine("Sorry, this program currently supports a maximum of three different reports to analyze at a time."); 
     return; 
    } 
    else if (args.Length == 0) 
    { 
     List<string> fL = new List<string>(); 

     for (int k = 0; k < 3; k++) 
     { 
      if (!loadFile(ref fL)) break; 
     } 

     if (fL.Count == 0) 
     { 
      InfoDisplay.HelpMessage(); 
      return; 
     } 
     else 
     { 
      args = fL.ToArray(); 
     } 
    } 

    // main program 
    ... 
} 

Répondre

0

trouvé un poste similaire here. Pas testé, mais donnez-moi un coup de feu et faites le moi savoir.

foreach(Process p in Process.GetProcesses) 
{ 
    if(p.MainWindowTitle = <the main UI form caption>) 
    { 
     if(IsIconic(p.MainWindowHandle.ToInt32) != 0) 
     { 
      ShowWindow(p.MainWindowHandle.ToInt32, &H1); 
      ShowWindow(f.Handle.ToInt32, &H1); 
     } 
     else 
     { 
      SetForegroundWindow(p.MainWindowHandle.ToInt32); 
      SetForegroundWindow(f.Handle.ToInt32); 
     } 
    } 
} 
+0

System.Windows.Forms.OpenFileDialog ne contient pas de définition BringToFront .... –

+0

est que vb.net? –

+0

Ouais, je viens de le convertir. –

1

Je sais que cela ne répond pas directement à la question, mais le OpenFileDialog a une propriété appelée « MultiSelect » qui indique si oui ou non l'utilisateur peut sélectionner plusieurs fichiers. Une fois que l'utilisateur a sélectionné le (s) fichier (s), la propriété FileNames (string []) est remplie avec tous les noms de fichiers. Vous pouvez ensuite faire une vérification comme ceci:

if(dialog.FileNames.Length > 3) 
{ 
    //only 3 are allowed 
} 
+0

droit, mais je crains que l'utilisateur ne le sait pas et il suffit de sélectionner un seul fichier tout en voulant charger 2 ou 3. ou les fichiers sont dans des endroits différents, ce qui rend il est difficile de charger tous les trois avecmultiselect. –

+3

Assez juste, mais du point de vue d'un utilisateur, je pense qu'être incité avec trois Dialog consécutifs serait citation ennuyante. Vous pouvez peut-être envisager un formulaire avec trois zones de texte et trois boutons Parcourir. Personnellement, je pense que ce serait un peu plus convivial OMI. – BFree

+0

Eh bien la chose est, j'ai fait une version gui et une version console.pour une raison quelconque, la version de la console est 10x plus rapide, malgré l'utilisation du même code pour le traitement principal ... –

1

J'ai rencontré le même problème dans une application console. OpenFileDialog.ShowDialog peut être appelé avec un argument de handle "fenêtre parent". Je crée un formulaire fictif et l'utilise comme argument de la fenêtre parent (le formulaire factice est invisible, puisque je n'appelle pas Show() dessus).

Le code suivant fonctionne pour moi:

Form dummyForm = new System.Windows.Forms.Form(); 

OpenFileDialog myOpenFileDialog1 = new OpenFileDialog(); 
if (myOpenFileDialog1.ShowDialog(dummyForm) == DialogResult.OK) { 
    fileName1 = myOpenFileDialog1.FileName; 
} 

OpenFileDialog myOpenFileDialog2 = new OpenFileDialog(); 
if (myOpenFileDialog2.ShowDialog(dummyForm) == DialogResult.OK) { 
    fileName2 = myOpenFileDialog2.FileName; 
} 
0

OpenFileDialog.ShowDialog peut être appelée avec une poignée argument de "fenêtre parent". Je crée un formulaire fictif et l'utilise comme argument de la fenêtre parente (le formulaire factice est invisible, car je n'appelle pas Show() dessus).

Le formulaire est un peu lourd, peut-être une étiquette à la place, car il prend juste un IWin32Window?

OpenFileDialog.ShowDialog(new Label()); 

Cela semble fonctionner.

Si quelqu'un pouvait trouver une solution raisonnable à cette question (maintenant) ressuscitée, ce serait génial.

Aaron

1

Pour moi, les formes factices et l'étiquette n'a toujours pas résolu le problème. CodeProject a une solution partielle à http://www.codeproject.com/KB/WPF/MessageBox.aspx

Vous pouvez ensuite utiliser Process.GetCurrent.Process.MainWindowHandle dans le constructeur de la classe dans l'article ci-dessus, puis passer l'instance à la boîte de dialogue de fichier, et il semble bien fonctionner (pour moi au moins).

Process p = Process.GetCurrentProcess(); 
WindowWrapper w = new WindowWrapper(p.MainWindowHandle); 
OpenFileDialog ofd = new OpenFileDialog(); 
var ret = ofd.ShowDialog(w); 
... 
Questions connexes