在处理时间期间隐藏OpenFileDialog和SaveFileDialog

时间:2013-12-07 15:58:48

标签: c# openfiledialog savefiledialog

我正在使用 OpenFileDialog 来打开我要在我的应用程序中处理的文件,但处理需要几秒钟,在此处理时间内 OpenFileDialog 保持可见,这很烦人! 我想在处理时隐藏我的OpenFileDialog! 同样的问题转到 SaveFileDialog

private void ofdImportation_FileOk(object sender, CancelEventArgs e)
        {
            Processing(); //Takes Few Seconds
            //ofdImportation remains visible during that time...
            //i want to hide it...
        }
谢谢大家......

2 个答案:

答案 0 :(得分:2)

if (OpenFileDialog.ShowDialog() == DialogResult.Ok)
{
  // Do stuff 
}

“确定”和“取消”事件应该针对UI特定的行为,而不管生成的文件是什么。

关注点分离

单击“确定”为您提供一个文件,“取消”为您提供一个空值,然后您有一个类,其中包含一个将对话框中的文件名传递给的进程方法。 它不应该关心文件名来自何处。

想想你必须跨越单元测试Processing()

的障碍

答案 1 :(得分:1)

假设您有一个打开对话框的按钮

解决方案1(这样窗口冻结所以它不是真正的解决方案,无论如何我发布了):

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    if (ofd.ShowDialog() == DialogResult.Ok)
    {
        Thread.Sleep(10000);
    }
}

解决方案2(使用BackGroundWorker,异步作业的有用工具):

public partial class Form1 : Form
{
    BackgroundWorker bgw;
    String fileUrl;

    public Form1()
    {
        InitializeComponent();
        bgw = new BackgroundWorker();
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        button1.Text = fileUrl;
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(10000);
    }


    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        var dlr = ofd.ShowDialog();
        if (dlr == DialogResult.Ok)
        {
            fileUrl = ofd.FileName;
            bgw.RunWorkerAsync();
        }
    }
}

编辑:'Thread.Sleep(10000)'模拟你的长时间运行过程('Processing();')