Чтение текстового файла, обновление полей C# и WPF - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь в основном создавать файлы конфигурации. Текстовый файл будет содержать что-то вроде:

Name::Adam
Location::Washington

Я пытаюсь получить первую часть в качестве имени поля (т.е. Name.Text обновит TextBox), а затем поместите вторую часть в это Text. Просто не уверен, где находится go или как лучше всего это построить. Приведенный ниже код неполный, потому что я не могу понять, как обновить текстовые поля.

Спасибо за помощь!

private void clickImportConfig_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
{
   Stream myStream = null;
   string fieldUpdate = string.Empty;
   string fieldUpdateTo = string.Empty;

   try
   {
      using (myStream)
      {
         string[] lines = File.ReadAllLines(@"c:\\config.txt");
         foreach (string s in lines)
         {
            var splitted = Regex.Split(s, "::");
            fieldUpdate = splitted[0].ToString();
            fieldUpdateTo = splitted[1].ToString();

         }
      }
   }
   catch (Exception ex)
   {
      MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
   }
}

Ответы [ 2 ]

0 голосов
/ 10 августа 2020

Я думаю, это то, что вы ищете:

private void clickImportConfig_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
{
    Stream myStream = null;
    string fieldUpdate = string.Empty;
    string fieldUpdateTo = string.Empty;

    try
    {
        using (myStream)
        {
            string[] lines = File.ReadAllLines(@"c:\\config.txt");
            foreach (string s in lines)
            {
                string[] splitted = s.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries);
                fieldUpdate = splitted[0].ToString();
                fieldUpdateTo = splitted[1].ToString();

                // TextBox textBox = (TextBox)this.FindName(fieldUpdate);
                // Or
                    TextBox textBox = this.FindName(fieldUpdate) as TextBox;
                // See below for an explanation
                if (textBox != null) // FindName returns null if nothing is found with that name
                {
                    textBox.Text = fieldUpdateTo;
                }
             }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
    }
}

Как указал insane_developer, вам будет лучше использовать метод String.Split (s - строка в этом случае, поэтому записывается как s.Split()) вместо Regex.Split. Это даст вам возможность удалить любые пустые результаты из массива. Он также может иметь лучшую производительность, поскольку Regex способен на гораздо более сложные вещи, но я не тестировал это, поэтому могу ошибаться.

Вы можете использовать метод FindName(string name), чтобы найти элемент с указанное имя. Этот метод возвращает null, если ничего не найдено, и object, если элемент найден. Этот object нужно будет привести к ожидаемому типу (т.е. TextBox). Вы можете сделать это одним из следующих способов:

TextBox textBox = (TextBox)this.FindName(fieldUpdate);

или

TextBox textBox = this.FindName(fieldUpdate) as TextBox;

Первый вариант выдаст InvalidCastException, если FindName возвращает объект, который не является TextBox. Второй вариант вместо этого просто установит значение textBox на null, которое будет проверяться оператором if, и исключение будет устранено. Поскольку в этом коде вы обнаруживаете только все общие c исключения, InvalidCastException покажет ваше сообщение «Не удалось прочитать файл с диска», что не соответствует действительности. Поэтому вы можете добавить дополнительный блок catch для обработки любого недопустимого приведения.

Если вам интересно, почему вы просто не придерживаетесь второго варианта, поскольку он решает эту проблему, тогда рассмотрите этот сценарий как пример. Допустим, в будущем вы решите по какой-то причине изменить все свои TextBox на TextBlock или что-то еще, но забываете вернуться, чтобы изменить этот код, или случайно в конечном итоге получите имя другого типа в текстовом файле. Второй вариант установит значение textBox на null, и ваши поля не будут обновлены. Но не будет абсолютно никаких ошибок, которые заставят вас чесать голову и отлаживать проблему. Первый вариант выдаст InvalidCastException, показывающий, где именно находится проблема. Затем вы можете выбрать, как справиться с этой проблемой, либо показывая другое окно сообщения, либо молча записывая ошибку в файл журнала et c.

0 голосов
/ 04 августа 2020

Вам не нужно регулярное выражение, просто:

var splitted = s.Split("::", StringSplitOptions.RemoveEmptyEntries);
fieldUpdate = splitted[0];
fieldUpdateTo = splitted[1];

В остальном вам нужно быть более явным

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