none
ошибка при фильтрации данных с помощью DefaultView.RowFilter RRS feed

  • Вопрос

  • Всем доброго дня!

    Ребят, такая проблема. На форме есть dataGridView, которая привязана к данным:

    dataGridView.DataSource = Table1.

    Сама таблица заполняется с помощью адаптера методом Fill(). С этим все норм.

    Пытаюсь поставить фильтр на столбец с помощью DefaultView.RowFilter:

    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("{0} like '%{1}%'", ColName, TextBox1.Text);

    где ColName - столбец со строковыми значениями. Все работает отлично.

    Но есть столбец с датами, к примеру ColNameDate, и я хочу поставить такой же фильтр, но при этом дату сразу приводить к текстовому формату с помощью функции to_char(timestamp, 'DD.MM.YYYY') (работаю с PostgreSQL):

    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("to_char({0}, 'DD.MM.YYYY') LIKE '%{1}%'", ColNameDate, TextBox1.Text);

    При выполнение выдает ошибку:  "Выражение содержит вызов не определенной фукнции to_char()".

    Пробовал взять всю эту функцию в одинарные кавычки: 

    string.Format("'to_char({0}, 'DD.MM.YYYY')' ...

    но теперь выдает ошибку: "Синтаксическая ошибка: отсутствует операнд после оператора "YYYY""

    Если кто сталкивался, подскажите, пожалуйста в чем может быть проблема. Такой запрос в самом PostgreSQL выполняется корректно.



    Андрей

    25 марта 2019 г. 15:29

Ответы

  • Проблема в том чти фильтрация осуществляется локально средствами DataTable и такой функции там нет. 

    Что там есть описано тут:

    https://docs.microsoft.com/en-us/dotnet/api/system.data.datacolumn.expression?view=netframework-4.7.2

    Как исправить: используйте правильные фильтры или фильтруйте на сервере базы данных.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа АндрейGreen 26 марта 2019 г. 12:49
    25 марта 2019 г. 15:55
    Модератор

Все ответы

  • Проблема в том чти фильтрация осуществляется локально средствами DataTable и такой функции там нет. 

    Что там есть описано тут:

    https://docs.microsoft.com/en-us/dotnet/api/system.data.datacolumn.expression?view=netframework-4.7.2

    Как исправить: используйте правильные фильтры или фильтруйте на сервере базы данных.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа АндрейGreen 26 марта 2019 г. 12:49
    25 марта 2019 г. 15:55
    Модератор
  • Ilya Tumanov, спасибо. Нужно было использовать локальную функцию CONVERT().

    И еще такой вопрос на засыпку =)

    Когда я назначаю строке RowState статус Deleted c помощью метода Delete(), она сразу удаляется и из dataGridView, еще до вызова метода Update() адаптера. Хочется просто изменять их RowState, но не удалять из dataGridView, а уже после вызова Update() чтобы они удалялись из dataGridView и из источника.


    Андрей

    26 марта 2019 г. 12:57