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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный сайд-эффект при вводе данных на форме, Портятся данные введенные в NumericUpDow 
:(
    Опции темы
Felan
Дата 29.8.2009, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть форма. 


Код

    public partial class ManFrm : Form
    {
        private readonly Man _Man;

        public ManFrm(Man aMan)
        {
            InitializeComponent();

            _Man = aMan;
            DataBind();
        }

        private void DataBind()
        {
            txbFamily.DataBindings.Add(new Binding("Text", _Man, "Family"));
            txbName.DataBindings.Add(new Binding("Text", _Man, "Name"));
            txbSecondName.DataBindings.Add(new Binding("Text", _Man, "SecondName"));
            dtpBirthday.DataBindings.Add(new Binding("Text", _Man, "Birthday"));
            txbCity.DataBindings.Add(new Binding("Text", _Man, "Address.City"));
            txbStreet.DataBindings.Add(new Binding("Text", _Man, "Address.Street"));
            nudHouseNumber.DataBindings.Add(new Binding("Value", _Man, "Address.HouseNumber"));
            nudFlatNumber.DataBindings.Add(new Binding("Value", _Man, "Address.FlatNumber"));
        }

        private void TextBoxValidating(object sender, CancelEventArgs e)
        {
            var ctrl = (Control) sender;
            if (ctrl.Text == String.Empty)
            {
                e.Cancel = true;
            }
            erpFamily.SetError(ctrl, "Нужно ввести более одного символа");
        }

        private void TextBoxValidated(object sender, EventArgs e)
        {
            erpFamily.SetError((Control) sender, String.Empty);
        }

        private void btnAccept_Click(object sender, EventArgs e)
        {
            if (ValidateChildren())
            {
                DialogResult = DialogResult.OK;
            }
        }

        private void nudNumber_Enter( object sender, EventArgs e )
        {
            var ctrl = (NumericUpDown) sender;
            (ctrl).Select(0, ctrl.Text.Length);
        }
    }



Полные файлы приложил в архиве.

Вызывается таким образом:


Код

            var man = new Man();
            var dlgNewMan = new ManFrm(man);
            if (dlgNewMan.ShowDialog(this) != DialogResult.OK)
                return;
            _MainUser.Relatives.Add(man);



Так вот. Заполняем поля и жмем Tab. Последовательно.
Начиная с фамилии и заканчивая номером квартиры.

Т.е. в процессе вводим значение номера дома, потом номера квартиры. Далее жмем таб, переходит фокус на кнопку "отменить", потом жмем таб еще раз и переходим на кнопку "принят", в этот момент значение номера дома (nudHouseNumber) сбрасывается в 0.

От чего такое может быть и как от этого избавится? 

Это происходит только если задавать оба знчения и для квартиры и для номера дома. Если только одно, то все нормально вроде... 


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Form.rar 4,59 Kb


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
diadiavova
Дата 30.8.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А ValidateChildren это что?


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


Опытный
**


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

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



Метод такой есть у формы. Не мой. Родной.

Кстати. Текст остальных классов есть тут

Добавлено через 1 минуту и 55 секунд
Да и не срабатывает он... для воспроизведения эффетка не нужно нажимать на кнопку. Достоточно просто нажать таб, что бы кнопка получила фокус.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
diadiavova
Дата 30.8.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Felan @  30.8.2009,  09:52 Найти цитируемый пост)
Метод такой есть у формы. Не мой. Родной.

Действительно есть smile 

В твоём аттаче только код формы. Запускаешь ты её при помощи непонятных классов. Выложи проект, никто не будет его собирать по кускам, чтобы посмотреть что там не так.


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


Опытный
**


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

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



Вот тестовый проект. Эффект посторяется однозначно.


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Test.rar 58,24 Kb


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
diadiavova
Дата 30.8.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Попробуй так
Код

            nudFlatNumber.DataBindings.Add( new Binding( "Value", _Man.Address, "FlatNumber",false, DataSourceUpdateMode.OnPropertyChanged ) );
            nudHouseNumber.DataBindings.Add( new Binding( "Value", _Man.Address, "HouseNumber",false, DataSourceUpdateMode.OnPropertyChanged ) );



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


Опытный
**


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

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



Так пробовал. Так нормально все.
Но в этом случае, даже если нажать отмену, то измененные данные все равно сохраняются... что собственно очевидно.
Ну это для случая редактирования, когда в форму передается не "чистый" объект, для "нового" человека, а уже существующий, для редактирования.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
diadiavova
Дата 30.8.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А для чего вообще тебе тут нужно связывание? Сделай примерно так
Человека опиши примерно такой структурой
Код

    public struct Person
    {
        public string FirstName,SecomndName,LastName,City,Street;
        public DateTime Birth;
        public int House, Flat;
    }


Дальше в форму введи метод типа такого
Код

        public Person GetPerson()
        {
            return new Person() { Birth=dtpBirthday.Value,
             City=this.txbCity.Text,
             FirstName=txbName.Text,
             Flat=(int)nudFlatNumber.Value,
             House=(int)nudHouseNumber.Value,
             LastName=txbFamily.Text,
             SecomndName=txbSecondName.Text,
             Street=txbStreet.Text};
        }

Когда диалог отработает вызовешь у него этот метод, он и выдаст результат. Мне лично не понятно зачем связывать всё. 
А в ноль оно сбрасывает потому, что связано со свойством и не успевает передать ему значение, а при обновлении возвращается то значение, которое есть у связанного объекта.


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


Опытный
**


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

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



Цитата(diadiavova @  30.8.2009,  16:47 Найти цитируемый пост)
А для чего вообще тебе тут нужно связывание?

Хм... да вобщем-то нет. Я в .NET человек новый smile Но вот начал длелать, и получилась такая странность...


Цитата(diadiavova @  30.8.2009,  16:47 Найти цитируемый пост)
Человека опиши примерно такой структурой

А в чем смысл? Почему нельзяя исползовать тот же класс Man?


Цитата(diadiavova @  30.8.2009,  16:47 Найти цитируемый пост)
Когда диалог отработает вызовешь у него этот метод, он и выдаст результат. Мне лично не понятно зачем связывать всё. 

Ну с методом понятно... Просто получится немного тяжеловатое решение для варианта редактирования. Ну да фиг с ним...
А что все? Что ты имеешь введу под "связывать все"?


Цитата(diadiavova @  30.8.2009,  16:47 Найти цитируемый пост)
А в ноль оно сбрасывает потому, что связано со свойством и не успевает передать ему значение, а при обновлении возвращается то значение, которое есть у связанного объекта. 

Ну странно как-то... что за обновление такое и почему оно только для этого происходит а не для всех связей?

ЗЫЖ Можешь тогда рассказать в двух словах практику применения связывания? Чисто из опыта? А то такого в книжках не ишут.

Это сообщение отредактировал(а) Felan - 30.8.2009, 17:14


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
diadiavova
Дата 30.8.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Felan @  30.8.2009,  17:55 Найти цитируемый пост)
А в чем смысл? Почему нельзяя исползовать тот же класс Man?

Можно, но я не знаю как ещё ты этот класс используешь, а структуры удобны для обмена информацией. Да к тому же описание её в трёх строчках содержится. Лишние взаимосвязи между объектами приводят к ошибкам, которые трудно отловить. Но это не значит, что нельзя этот использовать. Смотри по ситуации. Кстати если окошко используется для редактирования записи(а не только создания), то можно не метод а свойство прилепить, в сеттере инициировать начальные значения, а геттер оставить таким же как та функция, что я привёл.
Цитата(Felan @  30.8.2009,  17:55 Найти цитируемый пост)
Ну с методом понятно... Просто получится немного тяжеловатое решение для варианта редактирования. Ну да фиг с ним...

Ну это стандартная работа с диалоговыми окнами. Возьми какой-нибудь файл или колор диалог везде одна схема:
Создаётся экземпляр (обычно присутствует конструктор без параметров)
Некотором свойствам окна может быть присвоено инициирующее значение
Далее проверяется результат работы функции ShowDialog и если он удовлетворяет нужному условию(обычно ОК), то с диалога снимается результат его работы.

По-моему этот механизм самый удобный и безопасный.

Цитата(Felan @  30.8.2009,  17:55 Найти цитируемый пост)
Ну странно как-то... что за обновление такое и почему оно только для этого происходит а не для всех связей?

Там надо позыреть как оно по-умолчанию обновляется. Как видишь, если обновлять при изменении значения то этого не происходит.
Я в твой пример запихнул ещё NUD(ни с чем не связанный), эффект вроде пропал, но если пройтись табулятором по кругу ещё раз, то он появляется, только теперь уже для последнего из связанных NUD'ов(котроый квартира). Потом добавил ещё один и то же самое и опять для квартиры. И кстати эффект есть только когда перемещаешься табулятором, а значение меняешь цифровыми клавишами(если менять клавишами со стрелками, то всё нормуль).
Цитата(Felan @  30.8.2009,  17:55 Найти цитируемый пост)
Можешь тогда рассказать в двух словах практику применения связывания?

Ну обычно связывать удобно с таблицами или коллекциями. Каждый контрол привязывается к какому-то полю таблицы и когда перемещаешься по записям все контролы отображают значение связанного поля текущей записи.
Есть ещё другой пример связывания, это связывание с настройками приложения, здесь удобно то, что всё сохраняется даже при закрытии программы. 
Правда всё это делается в дизайнере, и основные преимущества связывания именно в том, что можно избавиться от значительной части ручного кода, и для работы с данными это удобно, но там всё стандартное и в мсдн полно примеров. 


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


Опытный
**


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

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



Цитата(diadiavova @  31.8.2009,  00:05 Найти цитируемый пост)
По-моему этот механизм самый удобный и безопасный.

Мда... пожалуй. Странно, на делвях сам все время так делал... а тут че-то понесло.


Цитата(diadiavova @  31.8.2009,  00:05 Найти цитируемый пост)
Потом добавил ещё один и то же самое и опять для квартиры. И кстати эффект есть только когда перемещаешься табулятором, а значение меняешь цифровыми клавишами(если менять клавишами со стрелками, то всё нормуль).

Странная фигня. Тему закрывать не буду. Но и сам уже переделал на обычное назначение. Черт с ним с биндингом.

Спасибо за отзывчивость smile


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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