Скрыть 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 ответа
if (OpenFileDialog.ShowDialog() == DialogResult.Ok)
{
// Do stuff
}
События OK и Cancel должны относиться к поведению конкретного пользовательского интерфейса независимо от того, для чего предназначен полученный файл.
Разделение проблем
Нажатие "ОК" дает вам файл, "Отмена" - "нулевой", а затем у вас есть класс с методом процесса, которому вы передаете имя файла из диалогового окна. Это не должно волновать, откуда пришло имя файла.
Подумайте о препятствиях, которые вам придется преодолеть, чтобы выполнить модульный тест.
Если у вас есть кнопка, чтобы открыть диалог
Решение 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();")