.Net C#WinForm DataGridView - TextBox Cell:什么是从数字用户输入更新/更改为特定文化货币的最佳方式?

时间:2016-09-15 06:15:42

标签: c# .net winforms datagridview

一个。问题背景

我正在尝试在datagridview中有一个单元格来接受一个仅限数字的用户输入,我已经在Grid的EditingControlShowing事件和文本框单元的KeyPress事件中处理了该输入。现在,在用户点击进入或离开该单元格的焦点后,我想更新单元格的值以获得小数分隔符和特定的文化货币。以下是我试图解释的流程:

  1. datagridview单元格上的数字用户输入 - >完成(注意:单元格的ValueType == int || double)。

  2. 单元格上的
  3. 离开焦点,更新单元格值以使文化中的小数分隔符和特定货币符号显示。 (具有特定文化的原因是,如果应用程序安装在具有不同文化的不同计算机上,它将保留在该特定文化上)。

  4. 在单元格中输入焦点或编辑,我想删除所有分隔符和货币符号,然后返回到仅数字用户输入值。

  5. B中。问题

    1. 首先,有没有办法在不使用CellFormatting事件的情况下实现它? (我希望避免使用此事件,因为此事件经常被调用,而且我不想对性能施加负担)。

    2. 我已经使用了以下内容:

      NumberFormatInfo numberFormat = CultureInfo.CreateSpecificCulture("de-DE").NumberFormat;
      double d = double.Parse(<value>, numberFormat);
      string test = d.ToString(numberFormat);
      
    3. 但是,它并没有真正更新价值,我在这里想念什么?

      1. 实现行为的最佳方式是,例如,cellValueChanged事件和CellEnter事件是处理上述行为的最佳事件吗?或CellValidated和CellEnter事件将是最好的事件?
      2. 基本上,我很困惑哪个事件是处理行为的最佳事件(没有被频繁调用,例如每次绘制网格时调用的CellFormatting事件,或者基本上每次触摸网格时调用) ,以及如何将NumberFormatInfo强制为该字符串值。

        谢谢!

        编辑(2016年9月15日):我实际上可以通过这样做来更新我想要的值:

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

        我认为numberFormat本身足以应用格式,因为它有信息,但我实际上必须明确指定格式,例如&#34; c2&#34;从上面的例子中,它就像一个&#34;命令&#34;从字典中获取信息&#34;在这种情况下,&#34; numberFormat&#34; (定义)。

2 个答案:

答案 0 :(得分:0)

所以,这就是我的工作方式:

  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&#39; event,以确保用户输入值的格式正确(或仅以数字形式):

    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;
      }
      ...
     }
    
  4. 注意:如果您执行上面的步骤#1(即"c2"并指定FormatProvider),则每次用户离开焦点时,它将自动显示货币符号和小数点该列的单元格。因此,唯一需要做的是剥离货币符号以及如何仅通过执行步骤#2以数字显示值。步骤#3,只是另一个验证,以确保输入是数字。

    示例流程:

    1. 用户单击该单元格并进行更多编辑,它将显示1000
    2. 用户点击另一个单元格或焦点离开,它将显示$1.000,00
    3. 用户再次点击该单元格并进行编辑,它将显示1000
    4. 以上解决方案对我来说足够好。

答案 1 :(得分:-1)

为什么拥有一个文化货币符号对你来说这么重要?为什么小数点这么大?程序可以在没有这些的情况下工作并实现相同的目标???在程序开始时确定货币的文化符号并且可能将其用作变量并稍后将其附加到字符串中是不是更好?