2010-02-23 54 views
6

在我的項目有一個用戶控件,其包括的NumericUpDown CTRL,其有效值範圍是從10 至100如何在失去焦點後保存NumericUpDown的無效值?

因此,如果用戶輸入200中的NumericUpDown Ctrl鍵,然後將其值後自動改變爲100焦點變成了其他的ctrl,它對客戶來說看起來有點好奇,因爲他們可能在NumericUpDown ctrl輸入200後點擊OK按鈕,他們需要一個消息框告訴他們他們輸入的值不在範圍內。

但問題是,如果以後的輸入值超出其範圍的重點改變的NumericUpDown值會自動改變。

那麼如何實現呢?

Sameh Serag,這是我測試過的代碼。我在表單上添加了一個按鈕,但什麼也沒做。對於我來說,輸入200後單擊按鈕,只顯示一個值爲100的消息框。在我輸入200並按Tab鍵後,它將只顯示一個值爲200的消息框,並且NumericUpDown中的文本值更改爲100.所以好奇:-)無論如何,非常感謝您的幫助!順便說一句,.Net框架版本是2.0與sp2對我來說。

public partial class Form1 : Form 
{ 
    private TextBox txt; 

    public Form1() 
    { 
     InitializeComponent(); 

     txt = (TextBox)numericUpDown1.Controls[1]; 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     MessageBox.Show(txt.Text); 
    } 
} 
+2

我不相信這是可能的,但1,因爲它是我敲了過去太有問題。我結束了切換回普通的舊文本框。 – 2010-02-23 04:12:13

+0

+1給馬特。NumericUpDown控件是有史以來最噁心的控件。我從來沒有觀察到用戶實際上點擊這些小按鈕或使用箭頭鍵。他們只是打字。如果你在平板電腦上,上帝會幫助你。 – Josh 2010-02-23 04:23:24

+0

@Carlos_Liu:在您對問題進行修改後,我更新了以下答案。順便說一句:它適用於你在上面描述的所有場景。試試吧,讓我們知道結果;-) – 2010-02-25 06:50:51

回答

13

訣竅是將文本框嵌入到數字updown控件中,並處理其Validating事件。

這裏是如何把它做:

創造一個虛擬的形式,並添加一個數字沿着上下控制和其他一些控制,而當數字unpdown控制失去焦點,窗體的文本將被設置爲用戶輸入的值。

這是什麼我也做了代碼:

public partial class Form1 : Form 
    { 
     TextBox txt; 
     public Form1() 
     { 
      InitializeComponent(); 
      txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
      txt.Validating += new CancelEventHandler(txt_Validating); 
     } 
     void txt_Validating(object sender, CancelEventArgs e) 
     { 
      this.Text = txt.Text; 
     } 
    } 

編輯:

@Carlos_Liu:好的,我現在可以看到這個問題,你可以用這個實現TextChanged事件,只是保存值虛擬變量,並在txt_Validating重用,但要謹慎,除非文本框集中不更新這個變量。

這是新的示例代碼:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) //don't save the value unless the textbox is focused, this is the new trick 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     MessageBox.Show("Val: " + val); 
    } 
} 

編輯#2

@Carlos_Liu:如果您需要輸入的值必須保持,還有做一招所以:@文本框的驗證事件,檢查值,如果它不在範圍內,取消放棄焦點!

下面是代碼的一個新版本:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1]; 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     int enteredVal = 0; 
     int.TryParse(val, out enteredVal); 
     if (enteredVal > numericUpDown1.Maximum || enteredVal < numericUpDown1.Minimum) 
     { 
      txt.Text = val; 
      e.Cancel = true; 
     } 
    } 
} 
+0

這似乎是因爲當輸入文本框的驗證事件沒有作用,該值已根據的NumericUpDown的分被切斷/最大值 – 2010-02-24 01:20:14

+0

不,它確實對我有用。確保你正在處理** Validating **而不是** Validated **事件。試一試,然後將其嵌入到您的項目中。 – 2010-02-24 10:16:32

+0

您是否嘗試輸入大於numericUpDown1的最大值的值? 假設NumericUpDown1中的最大值爲100,如果你輸入200,然後txt_Validating將NumericUpDown1中觸發後失去焦點,你可以彈出TXT文本如下### 無效txt_Validating(對象發件人,發送CancelEventArgs E) { MessageBox.Show(txt.Text); } ### 你會看到它的價值已經被切斷,以100 – 2010-02-25 02:57:19