【问题标题】:Hide OpenFileDialog and SaveFileDialog During Processing Time在处理期间隐藏 OpenFileDialog 和 SaveFileDialog
【发布时间】:2013-12-07 15:58:48
【问题描述】:

我正在使用 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...
        }

谢谢大家...

【问题讨论】:

  • 在你的事件处理程序中进行处理是不好的形式,你能不能把Processing()的执行移到执行主体中?
  • 只有它们的像素仍然可见。你的 UI 线程对世界来说已经死了,所以它不会重新绘制你的窗口。您可以将 this.Update(); 放在 Processing() 调用之前作为一种简单的解决方法。

标签: c# openfiledialog savefiledialog


【解决方案1】:
if (OpenFileDialog.ShowDialog() == DialogResult.Ok)
{
  // Do stuff 
}

OK 和 Cancel 事件应该针对 UI 特定的行为,无论生成的文件是什么。

关注点分离

单击 ok 给你一个文件,cancel 给你一个 null,然后你有一个带有 process 方法的类,你将文件名从对话框传递到。 它不应该关心文件名的来源。

想想你必须跨越到单元测试 Processing() 的障碍

【讨论】:

  • 谢谢托尼,事实上我以错误的方式使用 OpenFileDiag,就像@paqogomez 说的......我不知道“DialogResult”的存在,现在一切正常,谢谢全部。
【解决方案2】:

假设你有一个按钮来打开对话框

解决方案 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();
        }
    }
}

edit: 'Thread.Sleep(10000)' 模拟您长时间运行的进程 ('Processing();')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多