2009-11-10 73 views
1

我使用DataView.RowFilter來過濾DataView,我想比較舍入的double值而不是完整的double值。 例如,Value列中的值是大量精度的雙倍值,而我比較的值只有2個小數位。如何在DataView RowFilter中使用Round?

dataView.RowFilter = "Value IN (1.76, 1.92, 2.44)" 

不起作用。我想這樣做:

dataView.RowFilter = "Round(Value, 2) IN (1.76, 1.92, 2.44)" 

但這不起作用(ROUND()無法識別)

這甚至可能用的RowFilter?如果沒有,關於如何實現這一點的任何想法?

回答

1

嘿,我也對此感興趣,但我認爲我發現這是不可能的(至少在目前的ASP網絡功能集)。我找到的最有用的RowFilter資源是這樣的:http://www.csharp-examples.net/dataview-rowfilter/

在該網站中,最有用的小技巧是可以執行SUM,COUNT,MIN,MAX,AVG(平均值),STDEV(統計標準偏差)和VAR ;以及CONVERT,LEN,ISNULL,IIF,TRIM,SUBSTRING。

我的問題與過濾器是當你有一個底層值1.23456,並且你只顯示第一個數字(所以它會顯示1.23),然後嘗試過濾值= 1.23沒有結果。理想情況下,ROUND功能將允許我將行值集中到我感興趣的sig-digs中,但我也無法找到完成此操作的理想方法。

祝你好運,我會告訴你,如果我偶然發現任何東西。

編輯:其實,在我寫這篇文章之後,我想到了一個不太複雜的做法。一種行之有效的方法是,將兩個值乘以10^x,然後轉換爲整數。示例代碼如下:

int mult = Convert.ToInt32(Math.Pow(10.0, _defaultDecimalSignificantDigits)); //in your example 2 
      dv.RowFilter = String.Format("CONVERT({0}*{3},System.Int32){1}CONVERT({2}*{3},System.Int32)", name, expression, value, mult); //where "name" is your column name, "expression" is =, <>, etc, and "value" is the entered row filter value 

這些值不會在顯示中相乘,只能在過濾器邏輯中使用。所以如果你的分數是14.998,你的過濾器乘以1000(給你的過濾器和值爲14,998)。

這顯然有其侷限性根據你要找多少小數位四捨五入,但在你的回合2的例子中,你只需要通過100有了足夠大的數字和/或足夠的小數乘以兩您可能還會溢出Int32邊界,並且Int64可能是必需的。

+0

謝謝您的回答亞當。這是一個恥辱,它不能做得更優雅,但你的想法乘以10^x至少是一個辦法。Int64可能是避免溢出的一種更安全的方式。我會試一試你的想法。 – mikehamer

2

這可以通過與數學的棘手與過濾器字符串直接解決。

四捨五入到2 DP許多可以使用該差值將是一個事實的未舍入數目進行比較的0.01內0

1.23將是接近1.23456,靠近1.229876,因此:

1.23 - 1.23456 < 0.01 AND 
1.23 - 1.23456 > -0.01 

1.23 - 1.229876 < 0.01 AND 
1.23 - 1.229876 > -0.01 

所以你filterstring應該是:

fieldName - value < 0.01 AND fieldName - value > -0.01