使第二个和第三个OpenFileDialog出现在.NET / C#的控制台上方?

时间:2009-05-07 22:46:31

标签: c# .net winforms console openfiledialog

我正在编写一个可以接受1到3个文件的控制台程序。我使用OpenFileDialog三次接受文件,但第二次和第三次文件对话框在控制台窗口后面,很难注意到。有什么方法让它出现在上面?

问题的图像:

enter image description here

相关代码是:

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
    ...
}

5 个答案:

答案 0 :(得分:1)

我知道这并没有直接回答这个问题,但是OpenFileDialog有一个名为“MultiSelect”的属性,它指示用户是否可以选择多个文件。一旦用户选择了文件,属性FileNames(string [])将填充所有文件名。然后你可以像这样做一个检查:

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

答案 1 :(得分:1)

我在控制台应用程序中遇到了同样的问题。

可以使用“父窗口”句柄参数调用OpenFileDialog.ShowDialog。我创建一个虚拟表单并将其用作父窗口参数(虚拟表单是不可见的,因为我没有在其上调用Show())。

以下代码适用于我:

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;
}

答案 2 :(得分:1)

对我来说,虚拟表格和标签仍然无法解决问题。 CodeProject在http://www.codeproject.com/KB/WPF/MessageBox.aspx

处有部分解决方案

然后你可以在构造函数中使用Process.GetCurrent.Process.MainWindowHandle到上面文章中的类,然后将实例传递给文件对话框,它似乎运行良好(至少对我来说)。

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

答案 3 :(得分:0)

找到了类似的帖子here。没有经过测试,但请试一试,让我知道。

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);
        }
    }
}

答案 4 :(得分:0)

  

OpenFileDialog.ShowDialog可以   用“父窗口”句柄调用   论点。我创建了一个虚拟表格和   将其用作父窗口参数   (假的形式是看不见的,因为我   不要在上面调用Show())。

表格有点重,可能是标签,因为它只需要一个IWin32Window?

OpenFileDialog.ShowDialog(new Label());

似乎有效。

如果有人能够对这个(现在)复活的问题提出合理的解决方案,那就太棒了。

亚伦