Я думаю, это то, что вы ищете:
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.