UltraGrid货币单元显示4个小数位

时间:2017-10-09 14:07:52

标签: vb.net infragistics ultrawingrid

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

我们假设列的数据类型"费用"是小数。在编辑模式下使用浮点数的完整表示来查看原始值是绝对正常的。

但是,如果您想要对此数字进行舍入并显示,请说明只有前两个浮点数,您可以处理BeforeCellActivate事件处理程序并使用Math.Round()方法。

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

以下是代码段:

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;
    }
}

答案 1 :(得分:0)

尝试使用&#34; C2&#34;作为格式,看看是否修复它。

请注意,这将格式750到750.00美元,所以如果你想要750美元仍然是一个问题。

答案 2 :(得分:0)

考虑到这个问题,你得到以下行为似乎很奇怪:

  

验证工作的意义是在值前面显示一个£符号,但是,当我将数据加载到网格中并单击一行的“费用”单元格时,单元格显示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是十进制的。所以你有两种可能性来改变它:

  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 = ' ';
    }