C # - Использование цикла, чтобы открыть диалоговое окно - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь создать программу, которая загружает файл конфигурации из другого приложения.Если файл существует, он загружает его и отображает сообщение, но если файл конфигурации недействителен, он отображает сообщение об ошибке, а затем открывает диалоговое окно для загрузки правильного файла.Но если пользователь перезагружает неправильный файл, то же диалоговое окно должно появиться снова, но в этом случае мой код дает сбой.

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

Я знаю, что решением будет использование циклов, но я не уверен, как его структурировать.Pd: searchfile () - это моя функция для открытия диалогового окна, а readconfig () - моя функция для чтения файла конфигурации другого приложения.

    strfilenamepath = @"C:\Users\test\dogs.exe.config";

    if (File.Exists(strfilenamepath))
    {
        onlyFilename = System.IO.Path.GetFileName(strfilenamepath);
        textBox1.Text = onlyFilename;
        try
        {
            string[] valores = readConfig(strfilenamepath);
            MessageBox.Show(valores[0] + valores[1] + valores[2]);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error loading config file." + ex.Message);
            searchFile();
            onlyFilename = System.IO.Path.GetFileName(strfilenamepath);
            textBox1.Text = onlyFilename;
            string[] valores = readConfig(strfilenamepath);
            MessageBox.Show(valores[0] + valores[1] + valores[2]);
        }
    }
    else
    {
        searchFile();
        onlyFilename = System.IO.Path.GetFileName(strfilenamepath);
        textBox1.Text = onlyFilename;
        try
        {
            readConfig(strfilenamepath);
            string[] valores = readConfig(strfilenamepath);
            MessageBox.Show(valores[0] + valores[1] + valores[2]);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error loading config file." + ex.Message);
            searchFile();
            onlyFilename = System.IO.Path.GetFileName(strfilenamepath);
            textBox1.Text = onlyFilename;
            string[] valores = readConfig(strfilenamepath);
            MessageBox.Show(valores[0] + valores[1] + valores[2]);
        }
    }

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Проще спроектировать его, если вы извлекаете логику чтения в другой метод, который обрабатывает исключения и возвращает логическое значение, сигнализирующее об успехе и вычисленном результате.Шаблон TryDoSomething делает именно это.

В псевдокоде

public bool TryReadConfig(string path, out string[] valores)
{
    valores = null;
    try {
        valores = read the values;
        return true;
    } catch {
        Display message;
        return false;
    }
}

Основной цикл в псевдокоде

strfilenamepath = @"C:\Users\test\dogs.exe.config";

while (true) {
    if (File.Exists(strfilenamepath) && TryReadConfig(strfilenamepath, out var valores)) {
        Do something with the valores;
        break;
    }
    var ofd = new OpenFileDialog{ ... };
    if (ofd.ShowDialog() == DialogResult.OK) {
        strfilenamepath = ofd.Filename;
    } else {
        break; // The user canceled the operation.
    }
}
0 голосов
/ 02 октября 2018

Вы можете сделать что-то вроде этого:

try
{
    //Code to try open the file to memory
}
catch (Exception ex)
{
    while (true)
    {
        MessageBox.Show(@"Select an valid file");

        var path = searchFile();
        if (string.IsNullOrWhiteSpace(path))
            continue;

        try
        {
            //Code to try open the file to memory
        }
        catch (Exception ex2)
        {
            MessageBox.Show(@"The selected file is not valid");
            continue;
        }

        break;
    }
}
...