Скрыть 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...
        }

Спасибо всем...


person KADEM Mohammed    schedule 07.12.2013    source источник
comment
В любом случае, заниматься обработкой в ​​ваших обработчиках событий - это плохой тон, не могли бы вы просто переместить выполнение Processing() в основную часть выполнения?   -  person crthompson    schedule 07.12.2013
comment
Видны только их пиксели. Ваш поток пользовательского интерфейса мертв для мира, поэтому он не будет перекрашивать ваше окно. Вы можете поставить this.Update(); перед вызовом Processing () в качестве простого обходного пути.   -  person Hans Passant    schedule 07.12.2013


Ответы (2)


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

События OK и Cancel должны быть для конкретного пользовательского интерфейса, независимо от того, для чего предназначен результирующий файл.

Разделение проблем

Нажатие ОК дает вам файл, отмена дает вам значение null, затем у вас есть класс с методом процесса, которому вы передаете имя файла из диалогового окна. Его не должно волновать, откуда взялось имя файла.

Подумайте о препятствиях, которые вам придется преодолеть, чтобы перейти к модульному тестированию Processing ()

person Tony Hopkinson    schedule 07.12.2013
comment
Спасибо, Тони, на самом деле я использовал OpenFileDiag неправильно, как сказал @paqogomez ... я не знал о существовании DialogResult, теперь все работает нормально, спасибо всем. - person KADEM Mohammed; 07.12.2013

Предполагая, что у вас есть кнопка для открытия диалогового окна

Решение 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 ();')

person efkah    schedule 07.12.2013