Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Как в цикле на каждом шаге изменять имя значения в setings.setings ? (http://forum.oszone.net/showthread.php?t=235737)

Sadhacker 01-06-2012 13:07 1926007

Как в цикле на каждом шаге изменять имя значения в setings.setings ?
 
Вот есть код:
private void Form1_Load(object sender, EventArgs e)
{

for (int i = 1; i <= 3; i++)
{

string a;
a = (Properties.Settings.Default.s1);
label1.Text = a;


}
}


Мне нужно чтобы на каждом шаге в строчке "a = (Properties.Settings.Default.s1);" s1 увиличевалось на 1. Тоесть не 2 шаге а должно быть присвоено Properties.Settings.Default.s2. Делал "a = ("Properties.Settings.Default.s"+i);" но потом "а" присваивается путь "Properties.Settings.Default.s2", а не само знечение этого параметра.

Delirium 01-06-2012 13:55 1926043

Подсказка:
//Перебор всех свойств.
Код:

foreach(object obj in Properties.Settings.Default) //цикл для всех свойств
{
 
}

Далее можно проверять, если имя начинается с S, и последние цифры равны цифрам в цикле FOR, то выводить значение текущей obj.

Sadhacker 01-06-2012 13:58 1926047

Delirium, спасибо, сейчас попробую и отпишусь)

Цитата:

Цитата Delirium
foreach(object obj in Properties.Settings.Default) //цикл для всех свойств
{
} »


Ошибка 1 Оператор foreach не работает с переменными типа "WindowsFormsApplication1.Properties.Settings", поскольку "WindowsFormsApplication1.Properties.Settings" не содержит открытого определения для "GetEnumerator" C:\Documents and Settings\Администратор\мои документы\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 26 25 WindowsFormsApplication1

Delirium 02-06-2012 11:47 1926616

Хм... странно, я думал, у него есть интерфейс IEnumerator...
В понедельник потестирую на работе, попробуем что нибудь придумать.

Sadhacker 02-06-2012 23:13 1926956

Delirium, ок.

Delirium 04-06-2012 07:45 1927604

Код:

foreach (System.Configuration.SettingsProperty obj in Properties.Settings.Default.Properties) //цикл для всех свойств
            {
                textBox1.Text += obj.Name + "=" + obj.DefaultValue + Environment.NewLine;
            }

Результат в textBox: (s1-s5 - наименования параметров, a1-a5 - значения
Код:

s3=a3
s2=a2
s5=a5
s4=a4
s1=a1

Ну а дальше, я думаю, просто - проверять в IF, если имя равно S1-s5, то выводить те, что нужно.

Sadhacker 04-06-2012 19:40 1928005

Delirium, огромное спасибо!
Сделал вот так:
Код:

for (int i=0;i<=16;i++)
            {
                foreach (System.Configuration.SettingsProperty obj in Properties.Settings.Default.Properties) //цикл для всех свойств
                {

                    if (obj.Name == "s" + i)
                    {
                        textBox1.Text += obj.DefaultValue.ToString();

                    }

                }
               
            }

и все работает так как и надо было.

Delirium 05-06-2012 01:04 1928233

Sadhacker, оформляй код тегами CODE, а то читать тяжело. Всегда рады помочь.

Sadhacker 05-06-2012 12:45 1928430

Delirium, появилась проблема: когда изменяю значение параметра в файле config, оно не обновляется в программе. А именно в obj.DefaultValue. У меня все настройки редактируются вручную в файле настроек. Как сделать так что-бы значение обновлялось?

Delirium 06-06-2012 01:31 1929015

Цитата:

Цитата Sadhacker
Как сделать так что-бы значение обновлялось? »

Код:

Properties.Settings.Default.s1 = "новое значение";
Properties.Settings.Default.Save(); - Вот что самое главное! Иначе не сохранится. :)


Sadhacker 06-06-2012 13:16 1929347

Delirium, Вы не поняли. Из программы настройки изменять не нужно. Нужно, чтобы когда я изменяю значение в файле config через блокнот то оно подтягивалось в программу. А при использовании такого цикла как вы посоветовали значение остается таким же как было при компиляции программы. Это как-то можно решить, или все таки проще будет 16 раз скопировать кусок кода?

Delirium 06-06-2012 13:42 1929379

Цитата:

Цитата Sadhacker
то оно подтягивалось в программу »

Программа считывает данные из файла исходник.exe.config при старте программы. Файл config лежит рядом с EXE файлом. Если поменять значения блокнотом и запустить программу, то значения подтянутся. Если поменять их в ходе работы программы, то увы, не получится. Поможет только рестарт программы.
Для считывания таких параметров лучше завести отдельный какой нибудь INI файл, и в нем писать параметры и значения, и считывать их.

Sadhacker 06-06-2012 23:03 1929682

Delirium, вот в том и проблема что не обновляется даже после перезагрузки. Попробуйте запустить откомпелированным последний код что я збрасывал и понаблюдать что obj.DefaultValue остается старым.

Delirium 07-06-2012 01:03 1929753

Sadhacker, виноват, забыл кое о чем. Файл config лежит вот по этому пути C:\Users\USER\AppData\Local\Имя_Программы.

Sadhacker 07-06-2012 11:51 1929952

Delirium, я в настройках указал тип-приложение. Так что настройки лежат в папке с программой.

Delirium 08-06-2012 01:01 1930357

Цитата:

Цитата Sadhacker
Так что настройки лежат в папке с программой »

Если бы это было так, настройки бы подтягивались 100%. Так что дело в другом. Кинь проект, если он небольшой, я посмотрю, что там не так.

Sadhacker 09-06-2012 19:03 1931379

Вложений: 1
Delirium, вот.

Delirium 14-06-2012 01:25 1933819

OK, сегодня постараюсь посмотреть.

Сразу вопрос - зачем ставить .Net Framework 4 client profile? Для простых приложений 2 фреймворка за глаза. Рекомендую не напрягать системы большим фреймворком для выполнения простых задач.
По поводу сохранения - действительно странно, у меня раньше работало. Буду смотреть.
http://www.vr-online.ru/content/c-so...lozhenija-2146 - здесь тоже говорится, что надо делать как обычно.

Sadhacker 14-06-2012 18:22 1934237

Delirium, да я новичок. В версиях фреймворка не разбераюсь, вот и поставил самый последний, думал - самый лучший.

Delirium 15-06-2012 00:58 1934472

Цитата:

Цитата Sadhacker
да я новичок »

Тогда объясни мне смысл своей задачи? Я вот в упор не вижу, зачем необходимо делать то, что ты хочешь? Это я к тому, что наверняка для твоей задачи есть более удобные способы решения. Я даже навскидку один уже вижу. Опиши суть.

Sadhacker 15-06-2012 10:07 1934574

Delirium, этот проэкт я скинул для примера. А нужно мне делать так для загрузки новых баз по корпоративной сети на отделения где 2-4 компьтера. Архив загружается с ftp по adsl а потом розбрасывается на эти компьтера. Вот s1,s2 и т.д. это сетевой путь куда нужно збрасывать базы. Если значение стоит 0 то оно не используется. Тоесть мне поочереди нужно проверять значения от s1 до s16 и если там не 0 то копировать базы на этот адрес. Счас я просто скопировал 16 раз вот это:
Код:

          string a = Properties.Settings.Default.s1;                 
try                 
{                     
if (a != "0") //якщо параметр не пустий то                     
{                         
FileInfo fi = new FileInfo(Properties.Settings.Default.inftp); //ЧИТАЄМ РОЗМІР СКАЧАНОГО ІН ФАЙЛА
 // Чи є файл in.txt на сетевом пк                         
if (File.Exists(a + "in.txt"))                          //якшо є
 {
 FileInfo fi2 = new FileInfo(a + "in.txt"); //ЧИТАЄМ РОЗМІР файла на робочій станції
 long size2 = fi2.Length; // Читаєм розмір файла
 if (size/*Розмір файла на головном пк*/ != size2)
{
  FastZip FZ = new FastZip();
 FZ.ExtractZip(Properties.Settings.Default.putbasss, a, "");
 fi.CopyTo(a + "in.txt", true); //КОПІРУЄМ ЗАГРУЖЕНИЙ ІН НА ДРУГИЙ                                 
notifyIcon1.ShowBalloonTip(5000, "Загрузка БД", "БД загружены на " + a, ToolTipIcon.Info);                             
}                         
}                         
else //Якшо нема                         
{                             
FastZip FZ = new FastZip();                             
FZ.ExtractZip(Properties.Settings.Default.putbasss, a, "");                             
fi.CopyTo(a + "in.txt", true); //КОПІРУЄМ ЗАГРУЖЕНИЙ ІН НА ДРУГИЙ                             
notifyIcon1.ShowBalloonTip(5000, "Загрузка БД", "БД загружены на " + a, ToolTipIcon.Info);                         
}                     
}                 
}                 
catch (Exception ex)               
 {                     
notifyIcon1.ShowBalloonTip(5000, "Ошибка загрузки комунальных БД", ex.Message, ToolTipIcon.Error);                 
}

Весь проэкт збросить не могу. Мне нужно чтобы вследуйщий раз так само проверилось уже s2 и так до s16.

Sadhacker 15-06-2012 15:42 1934782

Delirium, кстати, у меня в visual studio 2010 professional доступно только framework 4.0 . Как туда можно 2.0 запихнуть? Я думал что просто нужно на пк установить фреймворк, но он так не появляется.

Sadhacker 15-06-2012 17:24 1934853

Delirium, о с фреймворком 2.0 разобрался, там просто нужно было поставить 3.5 sp1.

Delirium 15-06-2012 23:29 1935005

Ну в общем то я так и думал, что это будут пути. В данном случае проще всего работать с текстовиком и считывать его построчно.
Пример текстовика:
Код:

s1=d:\
s2=0
s3=c:\

Считываем его через File.ReadLine() - т.е. построчно. Далее ищем знак =, и все что слева - переменная, все что справа - путь. И вперед обрабатывать.
Плюсы подхода - гибкость использования и редактирование текстовика чем угодно.
Минусы - написание парсера для обработки текстовика. Но он будет максимум в 20 строчек.
Если у самого не получится, скажи, я напишу.

Sadhacker 17-06-2012 20:18 1935900

Delirium, ок, я попробую.


Время: 06:43.

Время: 06:43.
© OSzone.net 2001-