2014-09-19 4 views
1

Я хотел бы спросить, как создать пользовательский EventArg для существующего обработчика событий.C# NumericUpDown.OnValueChanged, как он был изменен?

Позволяет сказать, что у меня есть NumericUpDown numericUpDown управление, и я хочу обработчик для его OnValueChanged события. Двойной щелчок на ValueChanged в визуальной студии делает фрагмент кода, как этот

private void numericUpDown_ValueChanged(object sender, EventArgs e) 
{ 

} 

Однако, я хотел бы знать, как оно было изменено (например, +5, -4,7), но обычная EventArgs не имеет такой информации. Возможно, Decimal change = Value - Decimal.Parse(Text) сделал бы трюк (из-за замедленного изменения текста), но это уродливо и может не работать каждый раз.

Я предполагаю, что я должен сделать свои собственные EventArgs как этого

class ValueChangedEventArgs : EventArgs 
{ 
    public Decimal Change { get; set; } 
} 

, а затем каким-то образом переопределить NumericUpDown.OnValueChanged события для создания моего EventArgs с соответствующей информацией.

+1

Не могли бы вы просто сохранить предыдущее значение элемента управления, а затем сравнить его с текущим значением в обработчике событий? – APerson

+0

@APerson Если бы у меня было больше элементов управления этого типа с использованием одного обработчика событий, мне пришлось бы хранить все возможные предыдущие значения в течение всего времени выполнения. – Zereges

+0

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

ответ

2

Может быть гораздо проще просто пометить последнее значение.

private void numericUpDown1_ValueChanged(object sender, EventArgs e) { 
     NumericUpDown o = (NumericUpDown)sender; 
     int thisValue = (int) o.Value; 
     int lastValue = (o.Tag == null) ? 0 : (int) o.Tag; 
     o.Tag = thisValue; 
     MessageBox.Show("delta = " + (thisValue - lastValue)); 
    } 
+0

Ну, я не думал об использовании тега для этого. Это может сделать трюк, я, вероятно, буду использовать его. Однако, если бы я хотел использовать пользовательские аргументы событий, как бы я это сделал? – Zereges

+1

Просто небольшое предупреждение для тех, кто пытается сделать то же самое. '(int) o.Tag' throws' InvalidCastException', поэтому используйте скорее 'int.Parse (o.Tag.ToString())' или 'Convert.ToInt32 (o.Tag)' – Zereges

0

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

Делегат:

public delegate void MyOnValueChangedEvent(object sender, ValueChangedEventArgs args); 

Событие Args Класс:

class ValueChangedEventArgs : EventArgs 
{ 
    public Decimal Change { get; set; } 
} 
класс

New NumericUpDown, скрыть унаследованное событие с 'новым':

public class MyNumericUpDown : NumericUpDown 
{ 
    public new event MyOnValueChangedEvent OnValueChanged; 
} 

Посмотрите here инструкции о том, как для повышения вашего пользовательского события и here для дополнительной информации on при обработке событий.