Скрыть 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();")

Другие вопросы по тегам