Применить множественную фильтрацию к сетке данных WPF с помощью C # - PullRequest
1 голос
/ 26 сентября 2011

У меня есть сетка данных, которая boud к таблице базы данных. Я мог бы отфильтровать сетку данных, используя ICollectionView, используя код ниже:

            lstOrdsRlsd = new ObservableCollection<OrdsRlsd>(GV.dbContext.OrdsRlsds);
            view = CollectionViewSource.GetDefaultView(lstOrdsRlsd);

            if (lstOrdsRlsd.Count > 0)
            {
                dgRecords1.ItemsSource = view;                  
            }



  private void FilterRecords(string FieldName, string Condition, object Value1, object Value2)
    {
        OrdsRlsd vitem;
        switch (FieldName)
        {
            case "OrderNo":

                view.Filter = item =>
                {
                    vitem = item as OrdsRlsd;
                    switch (Condition)
                    {
                        case "=":
                            if (vitem.OrderNo == Convert.ToDouble(Value1))
                                return true;
                            break;
                        case ">=":
                            if (vitem.OrderNo >= Convert.ToDouble(Value1))
                                return true;
                            break;
                        case "<=":
                            if (vitem.OrderNo <= Convert.ToDouble(Value1))
                                return true;
                            break;
                        case "between":
                            if (vitem.OrderNo >= Convert.ToDouble(Value1) && vitem.OrderNo <= Convert.ToDouble(Value2))
                                return true;
                            break;
                    }

                    return false;
                };
                break;

            case "DateRqd1":

                view.Filter = item =>
                {
                    vitem = item as OrdsRlsd;
                    switch (Condition)
                    {
                        case "=":
                            if (vitem.DateRqd1 == Convert.ToDateTime(Value1))
                                return true;
                            break;
                        case ">=":
                            if (vitem.DateRqd1 >= Convert.ToDateTime(Value1))
                                return true;
                            break;
                        case "<=":
                            if (vitem.DateRqd1 <= Convert.ToDateTime(Value1))
                                return true;
                            break;
                        case "between":
                            if (vitem.DateRqd1 >= Convert.ToDateTime(Value1) && vitem.DateRqd1 <= Convert.ToDateTime(Value2))
                                return true;
                            break;

                    }
                    return false;
                };
                break;

}

Это работает для меня, когда есть только одно условие фильтрации. Но когда я применяю несколько условий, сетка данных фильтрует последнее условие. Этот код выполняется, когда пользователь нажимает кнопку фильтра.

   private void BtnFilter_Click(object sender, RoutedEventArgs e)
    {
        foreach (var rec in lstClsFilterGrid)
        {
            FilterRecords(rec.FieldName, rec.Condition, rec.Value1, rec.Value2);
        }

    }

где lstClsFilterGrid - список объектов класса с условиями фильтра.

Я прилагаю скриншот моей формы. enter image description here

1 Ответ

2 голосов
/ 26 сентября 2011

Таким образом, рабочий процесс в этой форме: пользователь создает условие для фильтрации и может дополнительно фильтровать коллекцию или добавлять другое условие, это правильно?

Если это так, то вам нужно будет иметь возможностьпередать набор условий (возможно, перегруженному методу фильтрации).

Ранее я выполнял фильтрацию по нескольким (фиксированным) условиям (т. Е. Нескольким флажкам, привязанным к свойствам, которые сопоставляются с предварительно подготовленными условиями, например, «Прошлые 30 дней», «Завершенные заказы», ​​«Просроченные отгрузки» и т. Д.).).

Мой фильтр будет проверять элементы на основе всех этих свойств.В вашем случае у вас есть неопределенное количество динамических условий.

Если бы это был я, у меня был бы список, к которому я бы добавил условия, а затем передал бы всю коллекцию в метод фильтрации, тогда каждый объект имел бычтобы выполнить все условия в цикле for для возврата true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...