簡體   English   中英

.Net C#WinForm DataGridView-文本框單元格:將數字用戶輸入更新/更改為特定區域性貨幣的最佳方法是什么?

[英].Net C# WinForm DataGridView - TextBox Cell: what's the best way to update/change from a numeric user input to a specific culture currency?

A.問題的背景

我試圖在datagridview中有一個單元格來接受僅數字用戶輸入,這是我在Grid的EditingControlShowing事件和文本框單元格的KeyPress事件中處理的。 現在,在用戶點擊該單元格之后,進入或離開焦點,我想更新該單元格的值以使用小數點分隔符和特定的區域性貨幣。 以下是我要解釋的流程:

  1. 在datagridview單元上的數字用戶輸入->完成(注意:單元的ValueType == int ||已經是double了)。

  2. 在單元格的離開焦點上,更新單元格值以顯示小數點分隔符和區域性中的特定貨幣符號。 (具有特定區域性的原因,這樣,如果將應用程序安裝在具有不同區域性的其他計算機上,它將保留在該特定區域性上)。

  3. 關於單元格的輸入焦點或編輯,我想剝離所有的分隔符和貨幣符號,然后返回僅數字的用戶輸入值。

B.問題

  1. 首先,有沒有一種方法可以在不使用CellFormatting事件的情況下實現呢? (我希望避免使用此事件,因為經常調用此事件,並且我不想給性能造成負擔)。

  2. 我已經使用以下內容:

     NumberFormatInfo numberFormat = CultureInfo.CreateSpecificCulture("de-DE").NumberFormat; double d = double.Parse(<value>, numberFormat); string test = d.ToString(numberFormat); 

但是,它並沒有真正更新價值,在這里我想念什么?

  1. 實現該行為的最佳方法是什么,例如,cellValueChanged事件和CellEnter事件是否是處理上述行為的最佳事件? 還是CellValidated和CellEnter事件將是最好的事件?

基本上,我對哪個事件是處理該行為的最佳事件感到困惑(沒有這么頻繁地調用,例如CellFormatting事件,該事件在每次繪制網格時或基本上在每次觸摸網格時都被調用),以及如何執行將NumberFormatInfo更改為該字符串值。

謝謝!

編輯(15/09/2016):通過執行以下操作,我實際上可以將值更新為所需的值:

string test = d.ToString("c2", numberFormat);

我認為numberFormat本身就足以應​​用格式,因為它具有信息,但是實際上我必須從上述示例中明確指定格式,例如“ c2”,並且它的作用類似於“命令”,它從“字典”,在這種情況下為“ numberFormat”(定義)。

因此,這對我來說是這樣的:

  1. 我以編程方式添加了DataGridViewColumn ,因此在創建這些列時,我設置了以下屬性:

     DataGridViewTextBox column = new DataGridViewTextBoxColumn(); ... column.ValueType = typeof(decimal); column.DefaultCellStyle.Format = "c2"; column.DefaultCellStyle.FormatProvider = CultureInfo.CreateSpecificCulture("de-DE").NumberFormat; 
  2. 處理DataGridView EditingControlShowing事件,以刪除“貨幣符號”並僅在編輯單元格的值期間顯示數字:

     public void Grid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { ... if(decimal.TryParse(grid.EditingControl.Text, NumberStyles.Currency, CultureInfo.CreateSpecificCulture("de-DE").NumberFormat, out decimalValue)) { grid.EditingControl.Text = decimalValue.ToString("#", CultureInfo.CreateSpecificCulture("de-DE").NumberFormat); } ... } 
  3. 處理“ CellValidating”事件,以確保用戶輸入值的格式正確(或僅數字形式):

     public void Grid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { ... //No need to check/validate the new row if (gridSender.Rows[e.RowIndex].IsNewRow) { return; } ... if(!decimal.TryParse(value, NumberStyles.Currency, CultureInfo.CreateSpecificCulture("de-DE").NumberFormat, out result)) { e.Cancel = true; } ... } 

注意:如果您執行上述第1步(即"c2"並指定FormatProvider ),則每次用戶離開該列單元格的焦點時,它將自動顯示貨幣符號和小數點。 因此,唯一要做的就是僅通過執行步驟2來剝離貨幣符號以及如何以數字顯示值。 步驟#3,只是另一個驗證,以確保輸入為數字。

流程示例:

  1. 用戶單擊該單元格並進行更多編輯,它將顯示1000
  2. 用戶單擊另一個單元格或將焦點移開,它將顯示$1.000,00
  3. 用戶再次單擊該單元格並進行編輯,它將顯示1000

上述解決方案對我來說足夠好。

為什么擁有文化貨幣符號對您來說如此重要呢? 為什么小數點這么大呢??? 如果沒有這些程序,程序可以工作並達到相同的目標嗎??? 在程序開始時確定貨幣的文化符號並可能將其用作變量並將其稍后附加到字符串上會更好嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM