2012-06-11 2 views
1

Мне нужно определить, было ли изменено значение элемента управления NumericUpDown событием mouseUp.Имеет значение «MouseUp» значение события NumericUpDown?

Мне нужно вызвать дорогостоящую функцию, когда значение numericupdown изменилось. Я не могу просто использовать «ValueChanged», мне нужно использовать события MouseUp и KeyUp.

enter image description here

В принципе, мне нужно знать:

ли значение изменения NumericUpDown, когда пользователь отпустил мыши? Если какой-либо участок, который не подсвечен красным цветом, нажат, ответ - нет. Мне нужно ИГНОРИРОВАТЬ событие мыши, когда будет нажата ANYWHERE, но красная область.

Как я могу определить это по коду? Я нахожу события немного запутанными.

+3

«Я не могу просто использовать« ValueChanged », мне нужно использовать события MouseUp и KeyUp». - Зачем? –

+0

«Если щелкнута какая-либо область, которая не подсвечена красным цветом, ответ не будет« ЧТО? вы можете захотеть переформулировать свой вопрос, считая, что мы понятия не имеем, что ваша программа делает или должна делать. Где находится красный цвет? Как обычно вы делаете изменение numericupdown? –

+0

@TomW Я сказал, мне нужно назвать дорогостоящую функцию 3D-рендеринга, которая занимает много времени. Если я назову его КАЖДОЕ ВРЕМЯ, значение изменится, это приведет к очень отстающему пользовательскому интерфейсу. Я уже использую ValueChanged с таймером, чтобы попытаться решить эту проблему, но когда пользователь отпустит мышь, я просто хочу, чтобы она снова отображалась, МГНОВЕННО. – David

ответ

2

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

EDIT

decimal numvalue = 0; 
    private void numericUpDown1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left && numvalue != numericUpDown1.Value) 
     { 
      //expensive routines 
      MessageBox.Show(numericUpDown1.Value.ToString()); 
     } 

     numvalue = numericUpDown1.Value; 
    } 

EDIT 2 Это позволит определить, если левый MouseButton по-прежнему вниз, если это выход, прежде чем выполнять дорогостоящую процедуру, не помогает с помощью кнопки клавиатуры вниз.

private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
    { 
     if ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left) 
     { 
      return; 
     } 
     //expensive routines 


    } 

Редактировать 3

How to detect the currently pressed key?

Поможет решить какую-либо клавишу вниз, хотя я думаю, что только те, которые имеют значение клавиши со стрелками

+0

прочитайте мой комментарий выше, пожалуйста. – David

+0

Отредактировано для отзыва заявки –

1

Я думаю, вы должны использовать Leave событие, когда фокус NumericUpDown управления ушел, он назвал бы его.

int x = 0; 
    private void numericUpDown1_Leave(object sender, EventArgs e) 
    { 
     x++; 
     label1.Text = x.ToString(); 
    } 
+0

Спасибо, но не всем, что мне нужно. Мне нужно, чтобы событие срабатывало мгновенно при нажатии, а не когда фокус ушел :( – David

2

проблема - мне нужно ИГНОРИРУЙТЕ событие мыши вверх, когда ВЕЗДЕ, но красная область нажата.

Выведите пользовательское числовое управление, как показано ниже. Получите TextArea цифрового управления и игнорируйте KeyUp.

class UpDownLabel : NumericUpDown 
{ 
    private Label mLabel; 
    private TextBox mBox; 

    public UpDownLabel() 
    { 
     mBox = this.Controls[1] as TextBox; 
     mBox.Enabled = false; 
     mLabel = new Label(); 
     mLabel.Location = mBox.Location; 
     mLabel.Size = mBox.Size; 
     this.Controls.Add(mLabel); 
     mLabel.BringToFront(); 
     mLabel.MouseUp += new MouseEventHandler(mLabel_MouseUp); 
    } 


    // ignore the KeyUp event in the textarea 
    void mLabel_MouseUp(object sender, MouseEventArgs e) 
    { 
     return; 
    } 

    protected override void UpdateEditText() 
    { 
     base.UpdateEditText(); 
     if (mLabel != null) mLabel.Text = mBox.Text; 
    } 
} 

В MainForm, обновите ваш дизайнер с этим элементом управления, т.е. UpDownLabel: -

private void numericUpDown1_MouseUp(object sender, MouseEventArgs e) 
{ 
    MessageBox.Show("From Up/Down"); 
} 

Приглашение от - https://stackoverflow.com/a/4059473/763026 & обрабатывается событие MouseUp.

Теперь используйте этот элемент управления вместо стандартного и подключите к событию KeyUp . Вы всегда будете получить событие KeyUp с помощью кнопки вверх/вниз только то RED AREA при нажатии кок кнопки [Вверх/Вниз, который снова отличается контролем, полученным от UpDownBase].

+0

+1 Умный ответ, спасибо :) – David

Смежные вопросы