WedX - журнал о программировании и компьютерных науках

NumericUpDown Control должен запускать событие ValueChanged только после завершения прокрутки

У меня есть элемент управления numericUpDown (Windows Forms).

введите здесь описание изображения

Я хочу прослушать ValueChanged событие.

Ставлю в свойствах и все работает.

Но:

Я хочу, чтобы я мог «прокручивать» вверх или вниз. (Если я сделаю это дольше, это будет быстрее)

Когда я закончу «прокрутку», я хочу, чтобы событие xyz запускалось сейчас, а не во время прокрутки.

Как я могу это сделать?


  • Как вы могли сообщить своему коду Когда я закончу прокрутку. Если вам нужно проверить числовой ввод, используйте событие Validating (когда вы выходите из элемента управления) 02.08.2012

Ответы:


1

Попробуйте использовать событие mouseup. Он срабатывает, когда вы убираете палец с левой кнопки мыши, поэтому теоретически он должен решить вашу проблему.

[Отредактировано Джеймсом] Попробуйте этот элемент управления в своей форме.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Example.CustomControl
{
    /// <summary>
    /// Provides an extra event for the numericUpDown control that fires after the value stops scrolling.
    /// </summary>
    public class NumericDelayedChange : NumericUpDown
    {
        /// <summary>
        /// Flag that the value has actually changed.
        /// </summary>
        /// <devdoc>
        /// Just in case the control was clicked somewhere other than the up/down buttons.
        /// </devdoc>
        private bool valueHasChanged = false;

        /// <summary>
        /// Fires when the value has stopped being scrolled.
        /// </summary>
        public event EventHandler OnAfterScollValueChanged;

        /// <summary>
        /// Captures that value as having changed.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnValueChanged(EventArgs e)
        {
            valueHasChanged = true;
            base.OnValueChanged(e);
        }

        /// <summary>
        /// Captures the mouse up event to identify scrolling stopped when used in combination with the value changed flag.
        /// </summary>
        /// <param name="mevent"></param>
        protected override void OnMouseUp(MouseEventArgs mevent)
        {
            base.OnMouseUp(mevent);
            if (mevent.Button == System.Windows.Forms.MouseButtons.Left)
            {
                PerformOnAfterScollValueChanged();
            }
        }

        /// <summary>
        /// Captures the key up/down events to identify scrolling stopped when used in combination with the value changed flag.
        /// </summary>
        /// <param name="mevent"></param>
        protected override void OnKeyUp(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
            {
                PerformOnAfterScollValueChanged();
            }
            base.OnKeyUp(e);
        }

        /// <summary>
        /// Checks the value changed flag and fires the OnAfterScollValueChanged event.
        /// </summary>
        private void PerformOnAfterScollValueChanged()
        {
            if (valueHasChanged)
            {
                valueHasChanged = false;
                if (OnAfterScollValueChanged != null) { OnAfterScollValueChanged(this, new EventArgs()); }
            }
        }
    }
}
02.08.2012
  • Разве элемент управления не прокручивается с помощью клавиш курсора вверх/вниз? Мышь вверх не сработает в этом случае. 02.08.2012
  • Думаю, добавить ту же логику и к клавише курсора. т.е. клавиша вверх, где клавиша является клавишей курсора, а также мышью вверх. 02.08.2012
  • В этом случае создайте подпрограмму для обработки того, что вы хотите сделать, и вызовите ее для событий MouseUp и KeyUp (если клавиши up относятся к клавишам со стрелками, а NumericUpDown имеет фокус). 02.08.2012
  • На самом деле у меня есть рабочий пример, но не хочу красть ваш гром! Могу я отредактировать ваш ответ? 02.08.2012
  • Продолжайте, я изучаю C# только последнюю неделю, до этого у меня было всего около 6-8 месяцев опыта работы с VB. Я, конечно, не профи, просто немного разбираюсь. 02.08.2012

  • 2

    Вам нужно определить, что такое I'm done with the scroll. Это может быть снятие мыши с кнопки прокрутки или определенное время, прошедшее с момента последнего щелчка. В любом случае, я не думаю, что вы можете заставить событие не запускаться, но вы можете сделать некоторые проверки в обработчике событий. Например:

    private DateTime? lastClickTime;
    public void MyUpDown_ValueChanged(object sender, EventArgs e)
    {
        if (lastClickTime != null && DateTime.Now.Subtract(lastClickTime.Value).Seconds > someInterval)
        {
            // Do the work
        }
    
        lastClickTime = DateTime.Now
    }
    

    Но, как я уже сказал, сначала нужно определить, что такое I'm done. Этот код не идеален.

    02.08.2012

    3

    Вот прямой способ решить проблему: просто проверьте, нажата ли кнопка мыши с помощью Control.MouseButtons, например:

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            //don't update until done scrolling
            if (Control.MouseButtons == MouseButtons.None)
            {
                // Do the work
            }
        }
    
    08.10.2014

    4

    Вот как я решил эту проблему:

    Задача проверяет флаг "valueIsChanging". Этот флаг устанавливается событием ValueChanged. После того, как событие ValueChanged перестанет устанавливать этот флаг в значение True, цикл while завершится и ваш код будет выполнен.

    Task waitForValueSettleTask;
    volatile bool valueIsChanging; // marked volaltile since it is access by multiple threads (the GUI thread, and the task)
    
    private void numericUpDown_ValueChanged(object sender, EventArgs e)
    {
        valueIsChanging = true;
    
        if (waitForValueSettleTask == null || waitForValueSettleTask != null &&
        (waitForValueSettleTask.IsCanceled || waitForValueSettleTask.IsCompleted || waitForValueSettleTask.IsFaulted))
        {
            waitForValueSettleTask = Task.Run(() =>
            {
                while (valueIsChanging)
                {
                    valueIsChanging = false;
                    Thread.Sleep(1000); // Set this to whatever settling time you'd like
                }
    
                // Your code goes here
            });
        }
    }
    
    27.06.2017
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]