Как читать из существующего файла .txt без жесткого кодирования (winforms)? - PullRequest
0 голосов
/ 23 октября 2019

Я работаю над проектом с winforms. Я хочу читать из существующего файла .txt, но без жесткого кодирования. Это означает, что я хочу разрешить пользователю указывать путь к файлу в качестве входных данных. Я попробовал следующий код:

private void pathSearch_TextChanged(object sender, EventArgs e)
{
    string path = "";
    OpenFileDialog ofd = new OpenFileDialog();

    if (ofd.ShowDialog() == DialogResult.OK)
    {
        path = ofd.FileName;
        pathSearch.Text = File.ReadAllText(path);
    }

    string[] lines = File.ReadAllLines(path);

    if (!File.Exists(path))
    {
        // Create a file to write to.
        string[] createText = { "Hello", "And", "Welcome" };
        File.WriteAllLines(path, createText);
    }

    string[] values;

    for (int i = 0; i < lines.Length; i++)
    {
        values = lines[i].ToString().Split('|');
        string[] row = new string[values.Length];

        for (int j = 0; j < values.Length; j++)
        {
            row[j] = values[j].Trim();
        }
        table.Rows.Add(row);
    }
}

Вы можете проверить screenshot1 и screenshot2 , чтобы дать вам представление о том, как это будет работать. Я хочу ввести путь внутри текстового поля, но это дает мне ArgumentNullException. После ввода пути я хочу импортировать с помощью кнопки, чтобы увидеть данные в этой таблице. Ps Я не уверен, если проверка существования пути, работает таким образом.

Редактировать
После комментариев я отредактировал свой код, и у меня есть кое-что, что работает. Однако, чтобы импортировать файл, я должен выбрать его 2 раза, и он пишет одинаковые строки дважды внутри таблицы. Как я могу это исправить?

1 Ответ

3 голосов
/ 23 октября 2019

Проблема в том, что вы делаете это в событии TextChanged текстового поля pathSearch, и вы изменяете текст внутри этого события, поэтому событие запускается дважды:

// This line of code causes the pathSearch_TextChanged event to fire again
pathSearch.Text = File.ReadAllText(path);

В качестве примечания: вы действительно хотите записать содержимое файла в свойство Text pathSearch, или вместо него должно быть FileName?


Вероятно, лучшее решение - не изменять содержимое элемента управления внутри события, которое запускается при изменении содержимого. Обычно OpenFileDialog запускается из события Button_Click:

// Launch the file browser dialog from the click event of the Import button
private void btnImport_Click(object sender, EventArgs e)
{       
    OpenFileDialog ofd = new OpenFileDialog();
    if (ofd.ShowDialog() != DialogResult.OK) return;

    var path = ofd.FileName;
    pathSearch.Text = path;

    // Code continues...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...