Динамические фильтры в DataView

344
10 февраля 2017, 02:00

Всем привет. Имею такую задачу: у меня есть gridcontrol и есть DataTable, которая для грида есть DataSource. Таблица представляет собой свод неких данных по поездкам. Я хочу добавить возможность фильтрации данных. Допустим, у меня есть три комбобокса - пользователи, статус поездки, город отправления. При выборе значения в каждом боксе - меняется фильтр для набора данных. К сожалению ничего более умного чем примерно такой вариант, я не придумал:

DataView dv = new DataView(Tables.dtTrips);
dv.RowFilter = (!string.IsNullOrEmpty(dv.RowFilter) ? dv.RowFilter + " and " : string.Empty) + "id_trip_state='" + id_state.ToString() + "'";

И такой код на изменение значения в каждом боксе. Фильтров может быть много, они могут меняться, а могут после добавления и быть отменены. Соответственно, вопрос - верный ли выбран путь. Если верный, второй вопрос - допустим мы выбрали пользователя в боксе, добавилась строка к фильтру "id_natural='" + u_id.tostring() + "'". если затем снова сменить юзера, то такая же строка но с другим айди просто добавится, что неправильно. Соответственно было решено юзать регулярное выражение, которое будет находить значение в одинарных кавычках после id_natural= , но как я не пробовал писать регулярку, у меня пока не получилось

Answer 1

Если кому интересно, в итоге написал класс для этой цели: Тут конкретно по моим требованиям.

public static class TripFilters
{
    static Dictionary<string, string> trips_filters = new Dictionary<string, string>();
    // Добавление, изменение, или удаление записи
    public static void Refresh(string key,string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            trips_filters.Remove(key);
            return;
        }
        if (!trips_filters.ContainsKey(key))
            trips_filters.Add(key, value);
        else
            trips_filters[key] = value;
    }              
    // Получаем итоговый фильтр для DataView
    public static string GetFilterString()
    {
        string res = string.Empty;
        string condition = string.Empty;
        foreach (var x in trips_filters)
        {
            switch (x.Key)
            {
                case "date_from":
                    condition = ">=";
                    break;
                case "date_to":
                    condition = "<=";
                    break;
                default:
                    condition = "=";
                    break;
            }                   
            res += (string.IsNullOrEmpty(res) ? string.Empty : " and ") + string.Format("{0}{1}'{2}'",x.Key.Contains("date")?"date":x.Key,condition,x.Value);
        }
        return res;
    }
}
READ ALSO
Что такое модель?

Что такое модель?

Довольно часто встречается понятие модели в терминах, например, MVC или ORMНо что это такое ?

341
Просто перебор по алфавиту

Просто перебор по алфавиту

Завис я над таким вопросом, чтобы поставить интервал от и до, типа так:

405
Какой Кросплатформенный GUI лучший на C#?

Какой Кросплатформенный GUI лучший на C#?

Нужен для работы программы на Windows и Linux

287
Метод с параметром &lt;T&gt;

Метод с параметром <T>

Есть необходимость задавать текстовую маску для двух компонентов разных типовКаждый из них эту возможность поддерживает

231