Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Защита от дурака, Проверка правильности вводимых данных 
:(
    Опции темы
myendlessness
Дата 20.7.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



http://msdn.microsoft.com/ru-ru/library/wabtadw6.aspx   вот сделал так как написано в инструкции при помощи конструктора, получилось что есть параматр приложения  ftp://mail.ru, имя ему UserTextBox, он пользовательский. Затем я запускаю программу и пишу вместо mail.ru, например mail.tut.by, закрываю программу, однако, при следующей загрузке он всё равно пишет  mail.ru. почему он не сохранил изменения?

Добавлено через 1 минуту и 33 секунды
Спасибо ребята, что помогаете. Узнаю много полезного и нового от Вас и быстро учусь программировать на C#! smile

Добавлено через 10 минут и 26 секунд
Всё с этим разобрался, здорово офигенно smile  надо было в validating  вставить строчку -  Properties.Settings.Default.Save();
и теперь всё работает!

осталось понять как избавиться от красного кружка в ErrorProvider? Текст исчезает, а красный кружок остаётся! 
PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(myendlessness @  20.7.2009,  12:43 Найти цитируемый пост)
надо было в validating  вставить строчку -  Properties.Settings.Default.Save();

Ну да, так и есть, просто мне в шарпе не приходилось с этим работать, а в васике всё происходит автоматически smile 
Цитата

Для управления отдельными параметрами приложения используйте свойства объекта My.Settings в Visual Basic или объекта Settings в других языках. В языках, отличных от Visual Basic, необходимо явным образом вызвать метод Save этого класса-оболочки, чтобы сохранять пользовательские настройки. Обычно это выполняется в обработчике событий Closing главной формы. В Visual Basic конструктор автоматически создаст код для сохранения текущих значений всех параметров пользователя при завершении работы приложения.

Цитата(myendlessness @  20.7.2009,  12:43 Найти цитируемый пост)
осталось понять как избавиться от красного кружка в ErrorProvider? Текст исчезает, а красный кружок остаётся!  

Куда исчезает? Я так понимаю, если текст исчез, значит он не прошёл проверку и предупреждение не должно исчезнуть. По идее код рабочий.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 20.7.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Так вот и я не понимаю, else срабатывает error=null из-за этого текст исчезает, а кружочек остаётся красный и с пустой строкой.
PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



myendlessness, ерорпровайдер не надо каждый раз создавать, но проблема не в этом... в регулярном выражении. 
Код

Regex re = new Regex(@"^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$", RegexOptions.Multiline);

Создай его с указанной опцией.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 21.7.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Сделал вот так и всё равно красный кружочек не исчезает, хотя else срабатывает! 

Код

 private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            string error = null;
            ErrorProvider f = new ErrorProvider();
            Regex re = new Regex(@"^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$", RegexOptions.Multiline); //regular expression
            if (!re.IsMatch(textBox1.Text))
            {
                error = "Your adress is wrong!";
                e.Cancel = true;
                f.SetError((Control)sender, error);
            }
            else f.SetError((Control)sender, " ");
            Properties.Settings.Default.Save();
       }

PM MAIL   Вверх
myendlessness
Дата 21.7.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Хотел ещё спросить по поводу оптимизации, как вот такой код сделать коротким? Повторяющиеся CheckBox связанные с TextBox
Код

if (checkBox1.Checked == true)
            {
                textBox1.Enabled = true;
            }
            else textBox1.Enabled = false;
            
if (checkBox2.Checked == true)
            {
                textBox2.Enabled = true;
            }
            else textBox2.Enabled = false;
         
 if (checkBox3.Checked == true)
            {
                textBox3.Enabled = true;
            }
            else textBox3.Enabled = false;

PM MAIL   Вверх
diadiavova
Дата 21.7.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(myendlessness @  21.7.2009,  11:27 Найти цитируемый пост)
Сделал вот так и всё равно красный кружочек не исчезает, хотя else срабатывает! 

Ты передаёшь провайдеру пробел, а надо - пустую строку. Просто пару кавычек рядом поставь и никаких пробелов между ними. Тот же эффект будет при null и при string.Empty
 
Цитата(myendlessness @  21.7.2009,  11:52 Найти цитируемый пост)
как вот такой код сделать коротким?

Вместо

Цитата(myendlessness @  21.7.2009,  11:52 Найти цитируемый пост)
if (checkBox1.Checked == true)
            {
                textBox1.Enabled = true;
            }
            else textBox1.Enabled = false;

надо написать

Код

                textBox1.Enabled = checkBox1.Checked?true:false;

С остальными - так же. Можно ещё связать свойства и тогда писать вообще ничего не придётся. В окне свойств разберись с пунктом DataBinding (в мсдн всё есть)


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 21.7.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



Спасибо за помощь, всё заработало. 

2 diadiavova 

 Подскажите пожалуйста, а если я использую   Scheme == "file" , то как правильно прописывается путь файла на локальной машине, как правильно написать escape-последовательность, что-то я  и так и сяк, но он не принимает?

и если кому не трудно, то напишите, пожалуйста,как будет выглядеть регулярное выражение, для файла на компьютере? 
PM MAIL   Вверх
diadiavova
Дата 21.7.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Не совсем понял о чём речь, видимо вопрос в том, как записать имя файла, чтобы обратные слэши воспринимались как есть. Либо писать 2 слэша вместо одного, либо перед строкой ставить собачку.
Код

Scheme = @"C:\\rgjrkjtgr\hjyhtyh.txt";
Scheme = "C:\\\\rgjrkjtgr\\hjyhtyh.txt";
Scheme = "C://rgjrkjtgr/hjyhtyh.txt";

Хотя в коде писать имя файла не стоит, разве что относительное.

А если речь о проверке пути, то по строке не надо проверять. Для этого есть классы пространства System.IO. Например System.IO.FileInfo вполне подойдёт.

Это сообщение отредактировал(а) diadiavova - 21.7.2009, 15:35


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 21.7.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



diadiavova  Вы просто святой человек smile  столько уже узнал полезного и нового, просто супер! Я говорил о том, что задача та же самая как и была раньше, только теперь мне надо проверять не FTP-адрес на правильность, а правильность написания локального адреса, то есть путь файла на данном компьютере, я так понял это можно сделать с FileInfo? сейчас почитаю! Спасибо за полезные советы! 
PM MAIL   Вверх
diadiavova
Дата 21.7.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(myendlessness @  21.7.2009,  17:12 Найти цитируемый пост)
diadiavova  Вы просто святой человек

Это да smile  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 22.7.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



ЧТо касается проверки локального адреса, существует ли такой каталог, то я написал такой код

Код

// the check of existing of a directory  -  проверяет существует ли такой каталог
            if (Directory.Exists(textBox3.Text))
            {
                errorProvider3.SetError((Control)sender, errorTextBox3);
            }
            else
            {
                errorTextBox3 = "Your adress doesn't exist!";
                e.Cancel = true;
                errorProvider3.SetError((Control)sender, errorTextBox3);
            }

            // the check of adress symbols  - проверяет нет ли символов, которые запрещены в использовании пути
            foreach (char invalidPChar in invalidPathChars)
            {
                for (int i = 0; i < textBox3.Text.Length; i++)
                {
                    if (invalidPChar == textBox3.Text[i])
                    {
                        errorTextBox3 = "Your adress has an incorrect symbol!";
                        e.Cancel = true;
                        errorProvider3.SetError((Control)sender, errorTextBox3);
                    }
                    else errorProvider3.SetError((Control)sender, errorTextBox3);
                }
            } 



С одной стороны первой проверки вроде достаточно, так как если символ будет некорректный, то она выдаст что такого каталога нет, однако, возможно есть такие варианты, которые может пропустить первая проверка, хотя может это излишняя перестраховка?

Вот возникает вопрос а если человек напишет - С:///\\\Admin/..\Books точно схавает этот адрес, а как после того как адрес пройдёт, привести его в человеческий вид, чтобы можно было дальше работать?
PM MAIL   Вверх
diadiavova
Дата 22.7.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Directory.Exists не просто строку  проверяет, этот метод разбирает её и выясняет, существует ли такой каталог. Со строкой лучше не заморачиваться когда есть готовый метод(почему - писал выше).

Цитата(myendlessness @  22.7.2009,  15:16 Найти цитируемый пост)
Вот возникает вопрос а если человек напишет - С:///\\\Admin/..\Books точно схавает этот адрес

С чего бы это?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 23.7.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 8.8.2008

Репутация: нет
Всего: нет



diadiavova  По ходу пьесы возникло ещё несколько вопросов, насчёт той стандартной проверки которую предложили Вы, а именно:  
Код

bool IsCorrectFtpAddress(string addr)
{
    if(Uri.IsWellFormedUriString(addr, System.UriKind.Absolute)
    {
        var u = new Uri(addr);
        if(uri.Scheme == "file") return true;
    }
    return false;
}


То я ввожу разные варианты адреса, и в том числе что описаны выше, а он не хочет их принимать пишет неправильный адрес, не могу понять, как правильно записывать file-строку в этом методе?

Так всё-таки стоит использовать только Directory.Exists? или лучше Uri.IsWellFormedUriString?

И ещё вопросик, вот я подключаю свои библиотеки и естественно прописываю адрес, а как сделать так чтобы при переносе на другой компьютер, не надо было прописывать повторно новый адрес, то есть записать так чтобы программа сама их всегда находила в нужной папке? 

PM MAIL   Вверх
diadiavova
Дата 23.7.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(myendlessness @  23.7.2009,  12:24 Найти цитируемый пост)

       var u = new Uri(addr);
        if(uri.Scheme == "file") return true;

Не так, а так
Код

       var u = new Uri(addr);
        if(u.Scheme == "file") return true;


Добавлено через 4 минуты и 6 секунд
Цитата(myendlessness @  23.7.2009,  12:24 Найти цитируемый пост)
Так всё-таки стоит использовать только Directory.Exists? или лучше Uri.IsWellFormedUriString?

Смотря где, если надо проверить существование каталога, то экзист, а если корректность адресной строки...

Цитата(myendlessness @  23.7.2009,  12:24 Найти цитируемый пост)
И ещё вопросик, вот я подключаю свои библиотеки и естественно прописываю адрес, а как сделать так чтобы при переносе на другой компьютер, не надо было прописывать повторно новый адрес, то есть записать так чтобы программа сама их всегда находила в нужной папке? 

Если они в папке с программой, то можно находить по относительному адресу, а в других случаях, если библиотека зарегистрирована, то можно по гуиду например, но вопрос надо уточнить, что за библиотеки.

Добавлено через 13 минут и 9 секунд
Проверил работу функции для файловой системы. Действительно выдаёт фальс. Проблема решается передачей строки в таком формате

вместо c://doc/aaa.txt надо писать file:///c://doc/aaa.txt

Хотя из обычной строки объект Uri создаётся, поэтому можно его просто создать и всё, а можно сначала(как я уже предлагал) проверить с чего начинается адрес, и в случае если это не file:/// просто добавить эту строку в начало. Тут есть варианты. smile 

PS
И имя функции неплохо бы поменять на более подходящее для задачи


Это сообщение отредактировал(а) diadiavova - 23.7.2009, 11:32


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1016 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.