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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NumericUrDown и прогрессивный Increment 
:(
    Опции темы
sulyco
Дата 18.4.2014, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую присутствующих.
В форме планируется использование нескольких экземпляров означенного контрола с одинаковой прогрессией изменения инкремента и отображаемых знаков после запятой.
При использовании стандартного контрола прогрессию приходится задавать два раза - в конструкторе формы для инициализации начальных значений и в событии ValueChanged для основной работы. При наличии одного контрола на форме вполне терпимо. Но появилась задача с использованием нескольких нумериков. Решил создать пользовательский  с наследованием.
В конструкторе размещаю назначения. Но, как, наверное, и следовало ожидать, инкремент получает значения инициализации и далее работает только с ними.
Вот и проблема: Надо переопределить свойство  Increment или событие ValueChanged?
Первично контрол такой:

Код

public partial class NumOdds : NumericUpDown
    {
        public NumOdds()
        {
            InitializeComponent();
            Maximum = 1000;
            Minimum = 1;
            if (Value < 2)
            {
                Increment = 0.01M;
                DecimalPlaces = 2;
            }
            if (Value >= 2 && Value < 3)
            {
                Increment = 0.02M;
                DecimalPlaces = 2;
            }
            if (Value >= 3 && Value < 4)
            {
                Increment = 0.05M;
                DecimalPlaces = 2;
            }
            if (Value >= 4 && Value < 6)
            {
                Increment = 0.1M;
                DecimalPlaces = 1;
            }
            if (Value >= 6 && Value < 10)
            {
                Increment = 0.2M;
                DecimalPlaces = 1;
            }
            if (Value >= 10 && Value < 20)
            {
                Increment = 0.5M;
                DecimalPlaces = 1;
            }
            if (Value >= 20 && Value < 30)
            {
                Increment = 1;
                DecimalPlaces = 0;
            }
            if (Value >= 30 && Value < 50)
            {
                Increment = 2;
                DecimalPlaces = 0;
            }
            if (Value >= 50 && Value < 100)
            {
                Increment = 5;
                DecimalPlaces = 0;
            }
        }                
        
    }

PM MAIL   Вверх
micronic
Дата 21.4.2014, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если задавать прогрессию с помощью ValueChanged
Цитата(sulyco @  18.4.2014,  10:41 Найти цитируемый пост)
При наличии одного контрола на форме вполне терпимо.

Тогда можете попробовать такой вариант
Код

        public Form1()
        {
            InitializeComponent();

            //После инициализации компонентов назначаем событию ValueChanged всех NumericUpDown на форме один и тот же обработчик ProgressiveValueChanged, а так же исполняем этот обработчик для начальной установки необходимых параметров
            foreach (Control control in this.Controls)
                if (control is NumericUpDown)
                {
                    (control as NumericUpDown).ValueChanged += ProgressiveValueChanged;
                    ProgressiveValueChanged(control, null);
                }
        }

        private void ProgressiveValueChanged(object sender, EventArgs e)
        {
            (sender as NumericUpDown).Maximum = 1000;
            (sender as NumericUpDown).Minimum = 1;
            if ((sender as NumericUpDown).Value < 2)
            {
                (sender as NumericUpDown).Increment = 0.01M;
                (sender as NumericUpDown).DecimalPlaces = 2;
            }
            if ((sender as NumericUpDown).Value >= 2 && (sender as NumericUpDown).Value < 3)
            {
                (sender as NumericUpDown).Increment = 0.02M;
                (sender as NumericUpDown).DecimalPlaces = 2;
            }
            if ((sender as NumericUpDown).Value >= 3 && (sender as NumericUpDown).Value < 4)
            {
                (sender as NumericUpDown).Increment = 0.05M;
                (sender as NumericUpDown).DecimalPlaces = 2;
            }
            if ((sender as NumericUpDown).Value >= 4 && (sender as NumericUpDown).Value < 6)
            {
                (sender as NumericUpDown).Increment = 0.1M;
                (sender as NumericUpDown).DecimalPlaces = 1;
            }
            if ((sender as NumericUpDown).Value >= 6 && (sender as NumericUpDown).Value < 10)
            {
                (sender as NumericUpDown).Increment = 0.2M;
                (sender as NumericUpDown).DecimalPlaces = 1;
            }
            if ((sender as NumericUpDown).Value >= 10 && (sender as NumericUpDown).Value < 20)
            {
                (sender as NumericUpDown).Increment = 0.5M;
                (sender as NumericUpDown).DecimalPlaces = 1;
            }
            if ((sender as NumericUpDown).Value >= 20 && (sender as NumericUpDown).Value < 30)
            {
                (sender as NumericUpDown).Increment = 1;
                (sender as NumericUpDown).DecimalPlaces = 0;
            }
            if ((sender as NumericUpDown).Value >= 30 && (sender as NumericUpDown).Value < 50)
            {
                (sender as NumericUpDown).Increment = 2;
                (sender as NumericUpDown).DecimalPlaces = 0;
            }
            if ((sender as NumericUpDown).Value >= 50 && (sender as NumericUpDown).Value < 100)
            {
                (sender as NumericUpDown).Increment = 5;
                (sender as NumericUpDown).DecimalPlaces = 0;
            }
        }


Если все же
Цитата(sulyco @  18.4.2014,  10:41 Найти цитируемый пост)
Решил создать пользовательский

Тогда можно сделать приблизительно такого вида UserControl
Код

public partial class ProgressiveNumericUpDown : UserControl
    {
        //Пользовательский ProgressiveNumericUpDown будет базироваться на этом контроле
        private NumericUpDown numericUpDown1;

        public ProgressiveNumericUpDown()
        {
            InitializeComponent();
            this.Size = new Size(120, 20);

            //Создаем базовый компонент NumericUpDown, добавляем его в наш контрол и растягиваем его там
            numericUpDown1 = new NumericUpDown();
            this.Controls.Add(numericUpDown1);
            numericUpDown1.Dock = DockStyle.Fill;
   
            //Присваиваем событию ValueChanged базового контрола наш механизм прогрессии и сразу же производим начальные установки
            numericUpDown1.ValueChanged += ProgressiveValueChanged;
            ProgressiveValueChanged(null, null);
        }

        private void ProgressiveValueChanged(object sender, EventArgs e)
        {
            numericUpDown1.Maximum = 1000;
            numericUpDown1.Minimum = 1;
            if (numericUpDown1.Value < 2)
            {
                numericUpDown1.Increment = 0.01M;
                numericUpDown1.DecimalPlaces = 2;
            }
            if (numericUpDown1.Value >= 2 && numericUpDown1.Value < 3)
            {
                numericUpDown1.Increment = 0.02M;
                numericUpDown1.DecimalPlaces = 2;
            }
            if (numericUpDown1.Value >= 3 && numericUpDown1.Value < 4)
            {
                numericUpDown1.Increment = 0.05M;
                numericUpDown1.DecimalPlaces = 2;
            }
            if (numericUpDown1.Value >= 4 && numericUpDown1.Value < 6)
            {
                numericUpDown1.Increment = 0.1M;
                numericUpDown1.DecimalPlaces = 1;
            }
            if (numericUpDown1.Value >= 6 && numericUpDown1.Value < 10)
            {
                numericUpDown1.Increment = 0.2M;
                numericUpDown1.DecimalPlaces = 1;
            }
            if (numericUpDown1.Value >= 10 && numericUpDown1.Value < 20)
            {
                numericUpDown1.Increment = 0.5M;
                numericUpDown1.DecimalPlaces = 1;
            }
            if (numericUpDown1.Value >= 20 && numericUpDown1.Value < 30)
            {
                numericUpDown1.Increment = 1;
                numericUpDown1.DecimalPlaces = 0;
            }
            if (numericUpDown1.Value >= 30 && numericUpDown1.Value < 50)
            {
                numericUpDown1.Increment = 2;
                numericUpDown1.DecimalPlaces = 0;
            }
            if (numericUpDown1.Value >= 50 && numericUpDown1.Value < 100)
            {
                numericUpDown1.Increment = 5;
                numericUpDown1.DecimalPlaces = 0;
            }
            //Если пользователь назначил на событие ProgressiveNumericUpDown.ValueChanged свой обработчик, то самое время вызвать его
            if (ValueChanged != null) ValueChanged(null, null);
        }

        //Расшариваем свойство Minimum базового контрола
        public decimal Minimum
        {
            get { return numericUpDown1.Minimum; }
            set { numericUpDown1.Minimum = value; }
        }

        //Расшариваем свойство Maximum базового контрола
        public decimal Maximum
        {
            get { return numericUpDown1.Maximum; }
            set { numericUpDown1.Maximum = value; }
        }

        //Расшариваем свойство Increment базового контрола
        public decimal Increment
        {
            get { return numericUpDown1.Increment; }
            set { numericUpDown1.Increment = value; }
        }

        //Расшариваем свойство Value базового контрола
        public decimal Value
        {
            get { return numericUpDown1.Value; }
            set { numericUpDown1.Value = value; }
        }

        //Объявляем событие ValueChanged для компонента ProgressiveNumericUpDown, которое будет происходить при изменении свойства Value базового контрола после того, как будут применены наши правила прогрессии
        public event EventHandler ValueChanged;
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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