Упростить код изменения видимости

395
07 февраля 2017, 18:39

Есть форма с текстбоксами nomer1, nomer2 и т.д. При загрузке формы считывается файл в котором прописано виден бокс или нет.

using (StreamReader reader = new StreamReader(@"C:\test\viseble.txt"))
{                                           
    if (reader.ReadLine() == "1 true")
    {
        nomer1.Visibility = Visibility.Visible;
    }
    else
    {
        nomer1.Visibility = Visibility.Hidden;
    }
    if (reader.ReadLine() == "2 true")
    {
        nomer2.Visibility = Visibility.Visible;
    }
    else
    {
        nomer2.Visibility = Visibility.Hidden;
    }
}

Текстбоксов много и получается очень большой кусок повторяющегося кода. Подскажите пожалуйста как это можно упростить?

Answer 1

Такие настройки предпочтительно хранить так:

Правый клик на названии проекта -> Properties -> Settings

Создаем нужные свойства. Scope User - настройки, которые можно изменять, Scope Application - настройки только для чтения.

//чтение настройки
this.textBox.Visibility = Properties.Settings.Default.ForTextBox1
            ? Visibility.Visible : Visibility.Hidden;
//запись настройки
Properties.Settings.Default.ForTextBox1 = false;
Properties.Settings.Default.Save();
Answer 2

Даже не меняя подхода к хранению настроек, как предложено в ответе @Bulson, код можно упростить.

using (StreamReader reader = new StreamReader(@"C:\test\viseble.txt"))
{
    TextBox tbs = { nomer1, nomer2 };
    foreach (var tb in tbs) 
    {
        bool vis = reader.ReadLine() == "true";
        tb.Visibility = vis ? Visibility.Visible : Visibility.Hidden;
    }
}

Здесь я убрал необходимость иметь номер (1 или 2) в файле настроек, т.к. они всё равно по Вашей логике расположены последовательно, т.е. первая строка - это видимость первого бокса, вторая - второго бокса.

Answer 3

Спасибо всем, было найдено такое решение:

using (StreamReader reader = new StreamReader(@"C:\visible.txt"))
        {
            for (int i = 1; i < 10; i++)
            {
                var box = (TextBox)FindName("textBox" + i);
                if (reader.ReadLine() == "true") { box.Visibility = Visibility.Visible; }
                else { box.Visibility = Visibility.Hidden; }
            }
        }

Считывается любое количество строк для любого количества элементов, взависимости от i.

READ ALSO
DataGrid (C#) Дублирование столбцов, update

DataGrid (C#) Дублирование столбцов, update

Здравствуйте, пишу приложение на WPFПытаюсь добавлять в DataGrid записи, но они дублируют столбцы и сама таблица после их добавления не обновляется,...

387
Изменение значения ProgressBar на C# WPF

Изменение значения ProgressBar на C# WPF

У меня есть приложение на wpf, которое достаточно долго пингует ряд ip-шниковЗахотелось установить ProgressBar

494
Наследование generic-класса от интерфейса

Наследование generic-класса от интерфейса

У меня есть классы и интерфейсы:

486