我正在使用 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...
}
谢谢大家......
答案 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();')