[英].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事件中处理的。 现在,在用户点击该单元格之后,进入或离开焦点,我想更新该单元格的值以使用小数点分隔符和特定的区域性货币。 以下是我要解释的流程:
在datagridview单元上的数字用户输入->完成(注意:单元的ValueType == int ||已经是double了)。
在单元格的离开焦点上,更新单元格值以显示小数点分隔符和区域性中的特定货币符号。 (具有特定区域性的原因,这样,如果将应用程序安装在具有不同区域性的其他计算机上,它将保留在该特定区域性上)。
关于单元格的输入焦点或编辑,我想剥离所有的分隔符和货币符号,然后返回仅数字的用户输入值。
B.问题
首先,有没有一种方法可以在不使用CellFormatting事件的情况下实现呢? (我希望避免使用此事件,因为经常调用此事件,并且我不想给性能造成负担)。
我已经使用以下内容:
NumberFormatInfo numberFormat = CultureInfo.CreateSpecificCulture("de-DE").NumberFormat; double d = double.Parse(<value>, numberFormat); string test = d.ToString(numberFormat);
但是,它并没有真正更新价值,在这里我想念什么?
基本上,我对哪个事件是处理该行为的最佳事件感到困惑(没有这么频繁地调用,例如CellFormatting事件,该事件在每次绘制网格时或基本上在每次触摸网格时都被调用),以及如何执行将NumberFormatInfo更改为该字符串值。
谢谢!
编辑(15/09/2016):通过执行以下操作,我实际上可以将值更新为所需的值:
string test = d.ToString("c2", numberFormat);
我认为numberFormat本身就足以应用格式,因为它具有信息,但是实际上我必须从上述示例中明确指定格式,例如“ c2”,并且它的作用类似于“命令”,它从“字典”,在这种情况下为“ numberFormat”(定义)。
因此,这对我来说是这样的:
我以编程方式添加了DataGridViewColumn
,因此在创建这些列时,我设置了以下属性:
DataGridViewTextBox column = new DataGridViewTextBoxColumn(); ... column.ValueType = typeof(decimal); column.DefaultCellStyle.Format = "c2"; column.DefaultCellStyle.FormatProvider = CultureInfo.CreateSpecificCulture("de-DE").NumberFormat;
处理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); } ... }
处理“ 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,只是另一个验证,以确保输入为数字。
流程示例:
1000
$1.000,00
1000
上述解决方案对我来说足够好。
为什么拥有文化货币符号对您来说如此重要呢? 为什么小数点这么大呢??? 如果没有这些程序,程序可以工作并达到相同的目标吗??? 在程序开始时确定货币的文化符号并可能将其用作变量并将其稍后附加到字符串上会更好吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.