2014-09-19 24 views
1

我想問如何爲現有的事件處理程序製作自定義EventArgs。C#NumericUpDown.OnValueChanged,它是如何改變的?

可以說,我有NumericUpDown numericUpDown控制,並且我想要處理它的OnValueChanged事件。雙擊以ValueChanged在Visual Studio使得網頁摘要

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 2014-09-19 16:17:05

+0

@APerson如果我使用相同的事件處理程序有更多的這種類型的控件,我將不得不在整個運行時存儲所有可能的先前值。 – Zereges 2014-09-19 16:22:19

+0

以前的內容沒有內置存儲。如果您需要跟蹤計算價值變化,則需要自行存儲。 – 2014-09-19 16:24:08

回答

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 2014-09-19 16:26:46

+1

只是小小的警告,任何人都想做同樣的事情。 '(int)o.Tag'拋出'InvalidCastException',所以用'int.Parse(o.Tag.ToString())'或'Convert.ToInt32(o.Tag)' – Zereges 2014-09-19 16:43:52

0

你必須創建自己的數字上下延伸的.NET版本控制,定義委託類型的事件,然後隱藏基控件事件屬性。

代表:

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

事件的args類:

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

新的NumericUpDown類,隱藏與 '新' 的繼承事件:

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

查找here關於如何指導以提高您的自定義事件,並提供其他信息here關於事件處理。

相關問題