2013-05-06 108 views
0

我想有條件地更改網格列的FormatString屬性。Devexpress Double條件FormatString

輸入是雙精度型。

我想要做的是以下幾點:

if (cellValue % 1 == 0) 
    aColumn.DisplayFormat.FormatString = "N0"; 
else 
    aColumn.DisplayFormat.FormatString = "N2"; 

有沒有辦法做到這一點在運行時無需檢查列的每個值?

任何幫助將不勝感激,謝謝!

回答

1

您可以使用方法來處理@kenrogers演示的ColumnView.CustomColumnDisplayText事件。

或者你可以使用Custom Formatting功能此列:

aColumn.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Custom; 
aColumn.DisplayFormat.Format = new CustomDoubleFormatter(); 

public class CustomDoubleFormatter : IFormatProvider, ICustomFormatter { 
    public object GetFormat(Type format) { 
     return this; 
    } 
    public string Format(string format, object arg, IFormatProvider provider) { 
     bool hasFractionalPart = ((double)arg % 1.0 > double.Epsilon); 
     return string.Format(hasFractionalPart ? "{0:N2}" : "{0:N0}", arg); 
    } 
} 

附:有關格式化單元格值的更多詳細信息,請參閱Formatting Cell Values幫助文章。

+0

完美的作品,謝謝。我更喜歡這種方法,而不是在「顯示時間」檢查值。這絕對是更快更穩定。 再次感謝Dimitry! – Fares 2013-05-07 08:34:14

1

據我所知,不,沒有。

實際上,你寫的會改變整個列的FormatString,而不是單個單元格,這不是你想要的。

我認爲你應該做的是處理GridView的CustomColumnDisplayText事件。您的處理程序會看起來像:

void gridView1_CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e) 
{ 
    if (e.Column.FieldName == "YourFieldName") 
    { 
     float value = Convert.ToDouble(e.Value); 
     if (value % 1 == 0) 
      e.DisplayText = string.Format("{0:N0}", value); 
     else 
      e.DisplayText = string.Format("{0:N2}", value); 
    } 
{ 

注意,如果你定義了自己的列GridView控件,你可以在事件處理程序的第一個條件表達式改變if (e.Column == myColumn),這應該是更有效的。

+0

感謝您的回覆@kenrogers。但我更喜歡Dimitry提出的方法,在運行時似乎更快。 謝謝! – Fares 2013-05-07 08:38:11