2013-02-06 87 views
1

我在應用程序中有一個用戶表單。一些字段被驗證。如果字段的值錯誤,則爲此控件繪製紅色邊框。它是通過處理此控件的Paint事件而完成的。我擴展了TextFieldDateTimePicker以從這些類對象中獲取Paint事件。我有類NumericUpDown的問題。它確實觸發了Paint事件,但正在調用爲NumericUpDown繪製邊框

ControlPaint.DrawBorder(e.Graphics, eClipRectangle, Color.Red, ButtonBorderStyle.Solid); 

完全沒有。任何想法或建議?如果我找不到任何方法來執行此操作,我將添加一個控制面板來控制NumericUpDown控件,並且我將更改其背景顏色。

每個時間處理程序都連接到Paint事件,我呼叫control.Invalidate()重新繪製它。

+0

你解決了嗎? – sparky68967

回答

3

試試這個:

public class NumericUpDownEx : NumericUpDown 
{ 
    bool isValid = true; 
    int[] validValues = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     if (!isValid) 
     { 
      ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Red, ButtonBorderStyle.Solid); 
     } 
    } 

    protected override void OnValueChanged(System.EventArgs e) 
    { 
     base.OnValueChanged(e); 

     isValid = validValues.Contains((int)this.Value); 
     this.Invalidate(); 
    } 
} 

假設你的值是int類型,而不是小數。你的有效性檢查可能會有所不同,但這對我有效。如果新值不在定義的有效值中,則會在整個NumbericUpDown周圍繪製紅色邊框。

訣竅是確保你在之後調用base.OnPaint來做邊框繪製。否則,邊界將被拖延。從NumericUpDown繼承,而不是分配給其繪畫事件可能會更好,因爲重寫OnPaint方法可以完全控制繪畫的順序。

+0

我試圖在不擴展'NumericUpDown'類的情況下實現它。謝謝你的幫助。我的擴展類不包含驗證方法,使其更加靈活。我通過setter中的Invalidate()調用了顏色和邊框樣式的屬性。 其實我可以讓委託和它的實例字段讓所有者添加驗證器到這個控件。 – Eloar