2012-06-11 76 views
1

我需要通過mouseUp事件來確定NumericUpDown控件的值是否已更改「MouseUp」事件是否改變NumericUpDown的值?

如果numericupdown的值發生變化,我需要調用一個昂貴的函數。我不能只使用「ValueChanged」,我需要使用MouseUp和KeyUp事件。

enter image description here

基本上,我需要知道:

做過的NumericUpDown變化值,當用戶讓 鼠標去? 如果點擊沒有突出顯示的區域,則 回答爲否。我需要忽略鼠標向上事件,當任何地方,但紅色區域被點擊。

如何通過代碼來確定這一點?我發現事件有點令人困惑。

+3

「我不能只用‘的ValueChanged’,我需要使用的MouseUp和KeyUp事件。」 - 爲什麼? –

+0

「如果點擊任何未用紅色突出顯示的區域,答案是否定的」什麼?你可能想重新陳述你的問題,因爲我們不知道你的程序做了什麼或者應該做什麼。紅色適合在哪裏?你通常如何讓你的numericupdown變化? –

+0

@TomW我說,我需要調用一個昂貴的3D渲染功能,這需要大量的時間。如果我每次調用它的值都會改變,它會導致UI非常滯後。我已經使用了與的ValueChanged一個計時器,試圖解決這個問題,但是當用戶放開鼠標,我只是希望它再次渲染,即刻。 – David

回答

2

當用戶釋放鼠標按鈕時會觸發。您可能想要調查發佈了哪個鼠標按鈕。

編輯

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。

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

來自簡稱 - - https://stackoverflow.com/a/4059473/763026 &處理MouseUp事件:

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更新你的設計師。

現在,使用此控件而不是標準的控件並掛鉤 KeyUp事件。當您單擊 微調[向上/向下按鈕,這又是一個不同的控制衍生 從UpDownBase]你將永遠得到向上/向下按鈕KeyUp事件僅即紅色區域

+0

+1聰明的答案,謝謝:) – David