2017-10-09 66 views
0

UltraGridコントロールを使用する前にこの問題は発生しませんでした。私はDataTableになるように私のグリッドの.DataSourceを設定しています。これは、SQL Serverデータベースから選択したレコードを使って塗りつぶされます。UltraGrid通貨セル小数点以下4桁を表示

"Fee"列の1つは、通貨形式である必要があります。これを行うには、私のInitializeLayoutイベントで、私はこれを検証するためにこの行を持っています。

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

検証が値の前に£記号を示している意味で動作し、私は、グリッドにデータをロードし、行の「料金」のセルをクリックすると、しかし、セルではなく、750.0000を示しますちょうど750または750.00

これまでに.Formatを「C」に設定していたときは、これは決して遭遇しませんでした。それ以外に何ができますか?これを解決する方法はありますか?

答えて

0

列 "Fee"のデータ型が10進数であるとします。編集モードで浮動小数点数を完全に表現した生の値を見ることは絶対に普通です。

しかし、この数値を丸めて、最初の2つの浮動小数点桁のみを表示したい場合は、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

私は自分のプロジェクトに実装しました。私は 'PrivateCellActivate'メソッドだけを' Private DataTable'ブロックを使用していません。私は間違いなく正しい列を使用しています – Harambe

0

フォーマットとして「C2」を使ってみて、それはそれを修正するかどうかを確認します。

これは、750から750.00のフォーマットになりますので、$ 750がまだ問題になっていることに注意してください。その問題を見ると

+0

まだ、同じではありません。 – Harambe

0

、あなたは次の動作を取得していることはかなり奇妙に思える:

私は、データをロードすると、検証が、しかし、値の前に£記号を示しているという意味で動作しますグリッドに、行の「手数料」のセルをクリックして、セルは、ちょうど750または750.00

正しい部分は、あなたが言ったように、あなたの通貨記号を取得する必要があり、フォーマットはしなければならないということであるのではなく、750.0000を示し編集モードでない場合も同様です:£750.00

しかし、他の部分は、編集モードで奇妙です。エディタでは、DataTable列の生の値が実際に表示されますが、「750.00000000」または「750.00000」の場合は、「750.0000」ではなく「750」と表示されます。

列が通貨に設定される前に、その行にある正確な値は何ですか?あなたはMath.Round

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

のような方法があるのUltraGridのultraGrid1_BeforeCellActivateイベントに適切にフックしている、としている場合

また、あなたは関係なく、正確なの、唯一の2桁の整数の後に、終わるだろうDataTableの値。

アプリケーションで使用しているInfragisticsコントロールのバージョンはどれですか? UltraGridに他の変更や設定が適用されていますか?

編集:別のノートで

、あなたはまだこれらの変更のすべての後に同じ動作が発生する場合、それはいくつかのシステムがそれをし続けることを意味する、とするとき、編集中に、まだ、小数点以下4桁を表示DataTypeがDecimalのデータ列を扱う場合のモード。だから、それを変更するには、2つの可能性がなければなりません:

  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 = ' '; 
    } 
    
関連する問題