2010-03-03 93 views
2

我正在使用numericupdown控件。當以編程方式分配值或用戶更改該值時,會觸發ValueChanged事件。C#winforms numericupdown控件

我希望事件只在用戶更改值時觸發,而不是在設置最小值和最大值時觸發。如何做呢?

回答

3

嘗試是這樣的:

var changeFromCode = false; 

void abc() 
{ 
    // This is where you change value in code. 
    changeFromCode = true; 
    ud1.Value = 15; 
    changeFromCode = false; 
} 

// Sorry, I am not sure about handler signatures 
void UpDownValueChanged(object sender, EventArgs e) 
{ 
    if (changeFromCode) 
     return; 
} 
+0

+1,簡單方便,它的工作原理。 –

+0

解決方案很簡單,它的工作原理 – Raghavendra

4

大廈TheVillageIdiot的答案...你可以創建可重用的子類,如:

public sealed class MyNumericUpDown : NumericUpDown { 

    private bool suppress; 

    protected override void OnValueChanged(EventArgs e) { 
     if (!suppress) { 
      base.OnValueChanged(e); 
     } 
    } 

    public void SetRange(decimal min, decimal max) { 
     suppress = true; 
     try { 
      Minimum = min; 
      Maximum = max; 
     } 
     finally { 
      suppress = false; 
     } 
    } 

} 
+0

+1我喜歡你將解決方案提升到更高抽象層次的方式,我想我可能會在頻繁的場合使用類似的策略,當我需要將遞歸抑制爲兩個或更多)「同步」控件(如TreeView和Listview)更新。好奇心:如果你想關注你爲什麼讓這個類封閉,爲什麼你使用了try/catch塊,那會很感激。謝謝 ! – BillW

+1

我有一個默認密封的習慣。在這種情況下,這並不重要。至於try/finally - 另一種習慣是避免一種情況,即異常退出方法將suppress set設置爲true。儘管在這種情況下,我不知道是否有可能發生異常,但確保將標誌恢復到原來的狀態始終是一種很好的做法。 – Josh

+0

+1謝謝你的迴應,喬希。我花了不到五分鐘的時間來實現一個「遞歸證明」派生的TreeView和ListView,遞歸由每個Public Property控制,並驗證它們是否按預期工作:一個缺點:您必須修改Designer.cs文件,或者自己鞭打它們,自己設置無數的屬性,或者至少使用默認控件進行設計,然後將設置從Designer.cs類中提取出來並將它們「移植」到其他位置,然後進入並將聲明切換爲派生類型。我通常反對在Designer.cs文件附近。 – BillW