Фильтрация указанных записей в вебформах

Вопрос или проблема

Проблема:

Я работаю над приложением ASP.NET WebForms, где мне нужно фильтровать записи в DataTable на основе диапазона дат. Диапазон дат выбирается с помощью выпадающих списков FromMonth, ToMonth, FromYear и ToYear. Цель состоит в том, чтобы отобразить отфильтрованные данные в RadGrid, но моя логика фильтрации работает не так, как ожидалось. Иногда данные не отображаются, или результаты неверные.

Проблема:

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

Шаги отладки, которые я предпринял:

  • Проверил, что поле PADate в базе данных имеет правильный формат DateTime.

  • Проверил, что значения из выпадающих списков (FromMonth, ToMonth, FromYear, и ToYear) верны.

  • Убедился, что поле PADate корректно обрабатывается как значение DateTime в логике фильтрации.

Ожидаемый результат:

Я хочу, чтобы сетка отображала только записи, где PADate попадает в выбранный диапазон дат (от FromMonth/FromYear до ToMonth/ToYear).

Код:

Вот метод, который я использую для фильтрации данных:

protected void PCApplicationStatus()
{
    try
    {
        // Получить выбранные значения из выпадающих списков
        int fromMonth = int.Parse(FromMonth.SelectedValue);
        int toMonth = int.Parse(ToMonth.SelectedValue);
        int fromYear = int.Parse(FromYear.SelectedValue);
        int toYear = int.Parse(ToYear.SelectedValue);

        // Создать диапазон дат
        DateTime startDate = new DateTime(fromYear, fromMonth, 1);
        DateTime endDate = new DateTime(toYear, toMonth, DateTime.DaysInMonth(toYear, toMonth));

        // Проверить, что дата 'От' раньше даты 'До'
        if (fromYear > toYear || (fromYear == toYear && fromMonth > toMonth))
        {
            throw new InvalidOperationException("Дата 'От' должна быть раньше даты 'До'.");
        }

        // Получить данные из базы данных
        AdDAL obj = new AdDAL();
        DataSet ds = obj.ExecutePaymentClaimQuery();

        if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
        {
            DataTable dt = ds.Tables[0];
            DataTable filteredDt = dt.Clone();  // Клонировать структуру исходной таблицы

            // Фильтровать строки на основе диапазона дат
            foreach (DataRow dr in dt.Rows)
            {
                DateTime? paDate = dr["PADate"] is DBNull ? (DateTime?)null : Convert.ToDateTime(dr["PADate"]);
                
                if (paDate.HasValue && paDate.Value >= startDate && paDate.Value <= endDate)
                {
                    filteredDt.ImportRow(dr);  // Импортировать строки, которые попадают в диапазон дат
                }
            }

            // Привязать отфильтрованные данные к сетке
            if (filteredDt.Rows.Count > 0)
            {
                Grid.DataSource = filteredDt;
            }
            else
            {
                Grid.DataSource = null;  // Совпадающих строк не найдено
            }

            Grid.DataBind();  // Повторно привязать сетку с отфильтрованными данными
        }
        else
        {
            // Данные недоступны
            Grid.DataSource = null;
            Grid.DataBind();
        }
    }
    catch (Exception ex)
    {
        // Логировать ошибку
        Console.WriteLine("Ошибка: " + ex.ToString());
    }
}

Ответ или решение

Фильтрация записей в WebForms: Решение проблемы с диапазоном дат

Проблема

В процессе работы над приложением ASP.NET WebForms возникла необходимость фильтрации записей в DataTable на основании диапазона дат. Выбор диапазона осуществляется с помощью выпадающих списков: FromMonth, ToMonth, FromYear, и ToYear. При отображении отфильтрованных данных в компоненте RadGrid возникают проблемы: иногда данные не отображаются вообще, либо результаты оказываются неверными.

Исходные данные

Формат данных: В архитектуре базы данных поле PADate должно быть в формате DateTime. Выбранные значения из выпадающих списков уже проверены на корректность.

Шаги по отладке

Созданный метод фильтрации был проанализирован, и выполнены следующие действия:

  1. Проверка формата поля PADate в базе данных.
  2. Удостоверение в правильности выбранных значений из выпадающих списков.
  3. Проверка правильности разбора значения PADate в логике фильтрации.

Ожидаемый результат

Ключевым моментом является отбор записей, где PADate попадает в указанный диапазон: от FromMonth/FromYear до ToMonth/ToYear.

Решение

Представляем доработанный код метода PCApplicationStatus, который реализует логику фильтрации с учетом всех упомянутых нюансов:

protected void PCApplicationStatus()
{
    try
    {
        // Получаем выбранные значения из выпадающих списков
        int fromMonth = int.Parse(FromMonth.SelectedValue);
        int toMonth = int.Parse(ToMonth.SelectedValue);
        int fromYear = int.Parse(FromYear.SelectedValue);
        int toYear = int.Parse(ToYear.SelectedValue);

        // Создаем диапазон дат
        DateTime startDate = new DateTime(fromYear, fromMonth, 1);
        DateTime endDate = new DateTime(toYear, toMonth, DateTime.DaysInMonth(toYear, toMonth));

        // Проверка валидности диапазона
        if (fromYear > toYear || (fromYear == toYear && fromMonth > toMonth))
        {
            throw new InvalidOperationException("Дата 'От' должна быть ранее даты 'До'.");
        }

        // Получаем данные из базы данных
        AdDAL obj = new AdDAL();
        DataSet ds = obj.ExecutePaymentClaimQuery();

        if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
        {
            DataTable dt = ds.Tables[0];
            DataTable filteredDt = dt.Clone();  // Клонируем структуру оригинальной таблицы

            // Фильтрация строк по диапазону дат
            foreach (DataRow dr in dt.Rows)
            {
                DateTime? paDate = dr["PADate"] is DBNull ? (DateTime?)null : Convert.ToDateTime(dr["PADate"]);

                if (paDate.HasValue && paDate.Value >= startDate && paDate.Value <= endDate)
                {
                    filteredDt.ImportRow(dr);  // Импортируем строки, попадающие в диапазон
                }
            }

            // Привязываем отфильтрованные данные к гриду
            Grid.DataSource = filteredDt.Rows.Count > 0 ? filteredDt : null;
            Grid.DataBind();  // Обновляем грид с отфильтрованными данными
        }
        else
        {
            // Нет доступных данных
            Grid.DataSource = null;
            Grid.DataBind();
        }
    }
    catch (Exception ex)
    {
        // Логирование ошибки
        Console.WriteLine("Ошибка: " + ex.ToString());
    }
}

Настройка фильтрации

  1. Создание диапазона дат: Базируемся на правильном определении начальной и конечной даты. Обратите внимание на использование метода DateTime.DaysInMonth для корректного определения количества дней в месяце.

  2. Проверка условий: Реализована проверка корректности введенного диапазона дат, предотвращающая возможные логические ошибки.

  3. Фильтрация данных: Используя цикл foreach, мы эффективно извлекаем необходимые строки и сохраняем их в новый DataTable.

Заключение

Данный подход обеспечивает точное отображение записей на основе выбранного диапазона дат. Внимание к деталям и использование стандартных практик программирования способствуют повышению надежности приложения. Если проблемы с отображением данных сохраняются, рекомендую дополнительно проверить источники данных и целостность кодировки данных в базе.

Оцените материал
Добавить комментарий

Капча загружается...