2017-10-09 70 views
0

使用UltraGrid控件時,我以前沒有遇到過此問題。我設置我網格的.DataSource是一個DataTable,如果將使用從SQL Server數據庫中選擇記錄填寫。顯示4個小數位的UltraGrid貨幣單元

其中一列「費用」需要採用貨幣格式。要做到這一點,在我的InitializeLayout事件,我有這條線來驗證這一點。

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

驗證在某種意義上說,是工作的顯示值前一個£跡象,然而,當我將數據加載到網格,單擊某行的「服務費」的細胞,細胞顯示750.0000,而不是隻是750或750.00

每當我將.Format設置爲「C」之前,我從來沒有遇到過這種情況。還有什麼可以的,還是有辦法解決這個問題?

回答

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

您好,感謝您的答覆。這個'BeforeCellActivate'方法還沒有解決問題,它仍然顯示爲4位小數。 – Harambe

+0

您是否按照原樣測試了我的整個樣本,或僅嘗試在您的項目中實施它?你確定新的價值真的被縮短了,並且你爲右欄做了轉換嗎? –

+0

我將它實現到我的項目中 - 我沒有使用'Private DataTable'塊,只使用'BeforeCellActivate'方法。我絕對使用正確的列, – Harambe

0

嘗試使用「C2」作爲格式,看看能否解決。

請注意,這會將750格式化爲750.00美元,因此如果您想要750美元,那仍然是個問題。

+0

不,還是一樣的。 – Harambe

0

展望說事,似乎很奇怪,你所得到的以下行爲:

驗證在某種意義上說,是工作的顯示值前一個£跡象,但是,當我加載數據入電網,並單擊某行的「服務費」的細胞,細胞顯示750.0000,而不僅僅是750或750.00

正確的部分是,你應該把你的貨幣符號像你說的,和格式必須是也不用時在編輯模式下:£750.00

然而另一部分,在編輯模式下時,很奇怪。編輯將真正展示你在你的數據表中列有原始值,但如果它是不是「750.00000000」或「750.00000」,它只會顯示整個數字 - 「750」,而不是,而不是「750.0000」。

在列被設置爲貨幣之前,您在該行中的確切值是多少?

此外,如果你是正確地鉤到ultraGrid1_BeforeCellActivate事件的UltraGrid,並擁有有像Math.Round

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

的方法整個號碼後,您會結束,只有2位,而不管具體的DataTable中的值。

您使用的應用程序中的哪種版本的Infragistics的控件?是否有任何其他更改或設置應用於您的UltraGrid?

編輯:

在另一方面,如果你仍然畢竟這些變化遇到相同的行爲,這將意味着,一些系統繼續這樣做,並且仍然顯示小數點後4位,在編輯時模式,以防處理DataType爲Decimal的Data Columns。所以,你將有兩種可能更改:

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