【问题标题】:UltraGrid Currency Cell Showing 4 Decimal PlacesUltraGrid 货币单元格显示 4 个小数位
【发布时间】:2017-10-09 14:07:51
【问题描述】:

我之前在使用UltraGrid 控件时没有遇到过这个问题。我将网格的 .DataSource 设置为 DataTable,如果使用从 SQL Server 数据库中选择的记录填充。

其中一列“费用”需要采用货币格式。为此,在我的InitializeLayout 事件中,我有这行来验证这一点。

e.Layout.Bands(0).Columns("Fee").Format = "C"

验证工作的意义是在值前面显示一个 £ 符号,但是,当我将数据加载到网格中并单击一行的“费用”单元格时,该单元格显示 750.0000,而不仅仅是 750 或 750.00

每当我将.Format 设置为“C”之前,我从未遇到过这种情况。还有什么可能,或者有没有办法解决这个问题?

【问题讨论】:

    标签: vb.net infragistics ultrawingrid


    【解决方案1】:

    假设“费用”列的数据类型是十进制。在编辑模式下看到完整表示浮点数的原始值是绝对正常的。

    但是,如果您想对该数字进行四舍五入并仅显示前两个浮点数,您可以处理BeforeCellActivate 事件处理程序并使用Math.Round() 方法。

    当然,其余的浮点数字会丢失,但是阅读给定的示例,在您的场景中似乎并非如此。

    这里是代码sn-p:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            this.ultraGrid1.BeforeCellActivate += new Infragistics.Win.UltraWinGrid.CancelableCellEventHandler(ultraGrid1_BeforeCellActivate);
            this.ultraGrid1.DataSource = InitializeDataSource();
            this.ultraGrid1.DisplayLayout.Bands[0].Columns[0].Format = "C";
        }
    
        private void ultraGrid1_BeforeCellActivate(object sender, Infragistics.Win.UltraWinGrid.CancelableCellEventArgs e)
        {
            if (e.Cell.Column.Key == "Fee")
            {
                e.Cell.Value = Math.Round(Convert.ToDecimal(e.Cell.Value), 2);
            }
        }
    
        private DataTable InitializeDataSource()
        {
            var dataTable = new DataTable();
    
            dataTable.Columns.Add("Fee", typeof(decimal));
    
            for (int i = 0; i < 100; i++)
            {
                dataTable.Rows.Add(new object[] { i * new Random().NextDouble() });
            }
    
            return dataTable;
        }
    }
    

    【讨论】:

    • 您好,感谢您的回复。这个BeforeCellActivate 方法没有解决问题,它仍然显示到小数点后4位。
    • 您是按原样测试我的整个示例还是尝试仅在您的项目中实现它?您确定新值确实缩短了并且您为正确的列进行了转换吗?
    • 我在我的项目中实现了它——我没有使用Private DataTable 块,只使用BeforeCellActivate 方法。我肯定也使用了正确的列
    【解决方案2】:

    尝试使用“C2”作为格式,看看是否能解决问题。

    请注意,这会将 750 美元格式化为 750.00 美元,因此如果您想要 750 美元,这仍然是个问题。

    【讨论】:

    • 不,还是一样。
    【解决方案3】:

    调查这件事,你得到以下行为似乎很奇怪:

    验证工作的意义是在值前面显示一个 £ 符号,但是,当我将数据加载到网格中并单击一行的“费用”单元格时,该单元格显示 750.0000,而不仅仅是 750 或 750.00

    正确的部分是你应该得到你所说的货币符号,并且在不处于编辑模式时格式也必须是这样:750.00 英镑

    但是,在编辑模式下的另一部分很奇怪。编辑器会真正显示您在 DataTable 列中的原始值,但如果它是“750.00000000”或“750.00000”,它只会显示整数 - “750”,而不是“750.0000”。

    在将列设置为货币之前,您在该行中的确切值是多少?

    另外,如果你正确连接到 UltraGrid 的 ultraGrid1_BeforeCellActivate 事件,并且有类似 Math.Round 的方法

    if (e.Cell.Column.Key == "Fee")
            {
                e.Cell.Value = Math.Round(Convert.ToDecimal(e.Cell.Value), 2);
            }
    

    无论 DataTable 中的确切值如何,您最终都会得到整数后仅 2 位数字。

    您在应用程序中使用的是什么版本的 Infragistics 控件?是否有任何其他更改或设置应用于您的 UltraGrid?

    编辑:

    另一方面,如果您在所有这些更改后仍然遇到相同的行为,则意味着某些系统会继续这样做,并且在编辑模式下仍显示 4 位小数,以防在处理数据列时其中 DataType 是 Decimal。所以你有两种可能来改变它:

    1. 将“费用”数据列的基础数据类型更改为“双倍”,您将不再有这种行为。
    2. 如果由于某种原因您无法执行第 1 项,则必须使用“费用”列的 MaskInput 属性,这将使您能够更改在编辑模式下看到的内容,例如:

          private void ultraGrid1_InitializeLayout(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e)
      {
      
          e.Layout.Bands[0].Columns["Fee"].Format = "C";
      
          //Set the mask to be in the following format:
          e.Layout.Bands[0].Columns["Fee"].MaskInput = "nnnn.nn";
      
          //If you would like to see the £ as well, you could use the one instead:
          e.Layout.Bands[0].Columns["Fee"].MaskInput = "£nnnnn.nn";
      
          //If you would like to change the under score (_), with another char like empty space ( ) you could do it like that:
          e.Layout.Bands[0].Columns["Fee"].PromptChar = ' ';
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2016-04-20
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多