2009-11-10 13 views
1

J'utilise DataView.RowFilter pour filtrer le DataView et je voudrais comparer des doubles valeurs arrondies plutôt que des doubles valeurs complètes. Par exemple, les valeurs dans la colonne Valeur sont doubles avec beaucoup de précision, alors que les valeurs que je compare sont seulement 2 décimales.Comment utiliser Round avec DataView RowFilter?

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

ne fonctionne pas. Je voudrais faire quelque chose comme:

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

mais cela ne fonctionne pas (Round() ne reconnaît pas)

Est-ce même possible avec RowFilter? Si non, des idées sur la façon dont je pourrais y parvenir?

Répondre

1

Hey, je suis également intéressé par cela, mais je pense que j'ai trouvé que ce n'est pas possible (au moins dans l'ensemble actuel de la fonctionnalité ASP Net). La ressource RowFilter la plus utile que j'ai trouvée est ici: http://www.csharp-examples.net/dataview-rowfilter/

Dans ce site, la friandise la plus utile est que vous pouvez faire SUM, COUNT, MIN, MAX, AVG (moyenne), STDEV (écart-type statistique) et VAR ; ainsi que CONVERT, LEN, ISNULL, IIF, TRIM, SUBSTRING. Mon problème avec le filtre est lorsque vous avez une valeur sous-jacente de 1,23456, et que vous affichez seulement les premiers chiffres de sig (donc il afficherait 1,23), puis essayez de filtrer où la valeur = 1,23 ne donne aucun résultat Idéalement, la fonctionnalité ROUND me permettrait d'arrondir les valeurs des lignes aux sig digs qui m'intéressent, mais j'ai également été incapable de trouver une façon saine d'y parvenir.

Bonne chance, je vous ferai savoir si je tombe sur quelque chose.

EDIT: En fait, après avoir écrit ceci, j'ai pensé à une manière moins joviale de le faire. Une façon qui fonctionne et n'est pas tout à fait terrible est de multiplier les deux valeurs par 10^x, puis de les convertir en entiers. Exemple de code ci-dessous:

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 

Les valeurs ne sont pas multipliées dans l'affichage, seulement dans la logique de filtrage. Donc, si votre score était de 14,998, vous multipliez votre filtre par 1000 (donnant à votre filtre une valeur de 14,998). Cela a évidemment des limites basées sur le nombre d'espaces décimaux que vous cherchez à arrondir, mais dans votre exemple de ronde par 2, vous auriez seulement à multiplier les deux par 100. Avec des nombres assez grands et/ou assez décimaux espaces arrondis, vous pouvez également dépasser les limites Int32, et Int64 peut être nécessaire.

+0

Merci pour votre réponse Adam. C'est dommage que cela ne puisse pas être fait plus élégamment, mais votre idée de multiplier par 10^x est au moins une façon de le faire.Int64 peut être un moyen plus sûr de le faire pour éviter le débordement. Je vais essayer votre idée. – mikehamer

2

Cela peut être résolu directement avec les chaînes de filtre en étant difficile avec les maths.

un nombre arrondi à 2 dp peut être comparé à un nombre non arrondi en utilisant le fait que la différence va être à l'intérieur de 0,01 0

à savoir 1.23 va être proche de 1.23456 et près de 1.229876 donc:

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 

Ainsi, votre filterstring devrait être:

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