2016-05-24 70 views
1

我試圖建立在C#中的TextBox/Windows窗體項目,這樣,當使用鍵盤或數字鍵盤在價格的用戶類型,文本框會格式化輸入序列看起來像一個價格。轉換序列爲價格

示例:用戶類型1-5-0(減去破折號),文本框的文本值將爲1.50美元。

這裏是我想要的代碼:

private string KeySequence; 

// ... 

private void TxtValue_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if(char.IsDigit(e.KeyChar)) 
    { 
     KeySequence += e.KeyChar.ToString(); 

     if (KeySequence.Length > 0) 
     { 
      txtValue.Text = "$" + (decimal.Parse(KeySequence)/100).ToString("0.00"); 
     } 
    } 
} 

的問題是,每當我在一個值類型,第一個字符始終是我打的最後一個關鍵,其次是「$」和價錢。所以如果我輸入150,格式化文本顯示爲:0$1.50

我就在想,這是由於KeyDown事件KeyPress之前被調用,所以我試圖與處理代碼爲壓制它:

private void TxtValue_KeyDown(object sender, KeyEventArgs e) 
{ 
    txtValue.Clear(); 
} 

但是,這仍然沒有工作。

我能做些什麼來阻止第一個字符出現?

+1

要取消按鍵,設定'e.Handled'到TRUE; –

+0

工作就像一個魅力。謝謝! –

回答

1

KeyPress事件之後,擊鍵將仍然由控制處理。

爲了防止這種情況,在事件處理程序中設置e.Handled = true;

0

我建議創建一個從NumericUpDown繼承的自定義控制。然後,您將擁有一個專門用於處理數字的控件,可自動處理小數位和千位分隔符,提供向上和向下控件以方便遞增,並可附加/預先添加適當的貨幣符號。

我偷的this answer的格式化部分。利用這一點,你的新類看起來是這樣的:

public class NumericUpDownCurrency : NumericUpDown 
{ 
    public NumericUpDownCurrency() 
    { 
     DecimalPlaces = 2; 
     Increment = 1; 
     ThousandsSeparator = true; 
    } 

    protected override void UpdateEditText() 
    { 
     ChangingText = true; 
     var decimalRegex = new Regex(@"(\d+([.,]\d{1,2})?)"); 
     var m = decimalRegex.Match(Text); 
     if (m.Success) 
      Text = m.Value; 
     ChangingText = false; 
     base.UpdateEditText(); 
     ChangingText = true; 
     Text = Value.ToString("C", CultureInfo.CurrentCulture); 
    } 
} 

該類添加到您的項目和建設。然後您應該在工具箱中看到NumericUpDownCurrency,並允許將它放在表單上。其餘的控件完成。