Как использовать RowFilter в DataTable для поиска строк, в которых столбец не равен нулю и больше или меньше значения?

Я пытаюсь отфильтровать DataTable значений координат x, y, z в определенном диапазоне для каждого из них. Например, я хочу видеть строки со значением x больше 200. Моя проблема в том, что DataTable считывается из DataGridView, и все поля интерпретируются как строки. Кроме того, в нескольких строках отсутствует хотя бы одно значение x, y или z, поэтому я хочу их исключить.

В качестве теста только для значений x я пробовал

(dataGridView1.DataSource as DataTable).DefaultView.RowFilter = "[X Value] 
IS NOT NULL AND CONVERT([X Value], 'System.Decimal') > 200.0";

и это приводит к сообщению об ошибке «Входная строка имеет неправильный формат». Я предполагаю, что это происходит потому, что он пытается преобразовать нулевое значение в десятичное. Я получаю ту же проблему, когда фильтр строк не включает половину [X Value] IS NOT NULL.

Можно ли сделать все это в одном RowFilter?


person Jayden933    schedule 09.09.2019    source источник
comment
Вы уверены, что все ненулевые значения в столбце X могут быть преобразованы в десятичные числа в соответствии с настройками вашей локали?   -  person Steve    schedule 10.09.2019
comment
Вы уверены, что тип DataColumn требует преобразования?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 10.09.2019
comment
@ Стив, да, я знаю, что мои ненулевые значения имеют приемлемый десятичный формат.   -  person Jayden933    schedule 10.09.2019


Ответы (1)


Нет, AND гарантирует, что если первое условие не выполняется, второе условие не оценивается. Так что ошибка вызвана не нулевым значением, а с большой вероятностью пустой строкой.

Просто измените свой тест на

"[x value] IS NOT NULL AND [x value] <> '' AND CONVERT([x value], 'System.Decimal') > 200.0";
person Steve    schedule 09.09.2019
comment
А, понятно! Я предполагал, что проверка [X Value] IS NOT NULL была такой же, как [X Value] <> '', но теперь я вижу разницу для нулевых значений и пустых строк. Я изменил фильтр строк на "TRIM([X Value]) <> '' AND CONVERT([X Value], 'System.Decimal') > 200.0", и это сработало. Спасибо! - person Jayden933; 10.09.2019