Отфильтрованные данные обновляются до нефильтрованных данных при нажатии на следующую страницу веб-формы GridView

#asp.net #webforms

Вопрос:

У меня есть проект веб-форм, в котором есть один фильтр. Когда пользователь фильтрует данные и нажимает на следующую страницу, фильтр, похоже, снимается, и отображаются данные по умолчанию. Как я могу это исправить? Это метод атрибута OnPageIndexChanging, который нуждается в обновлении? Я показал код ниже для метода ONPageIndexChanging и метода, используемого для привязки данных (пришлось вырезать некоторые, чтобы избавиться от ошибки «слишком много кода», но если я упускаю что-либо полезное, пожалуйста, дайте мне знать.)

    protected void dashboard_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        dashboard.PageIndex = e.NewPageIndex;
        BindDataToGridView();
    }

    void BindDataToGridView(SqlCommand cmdSQL = null)
    {
        // default sql
        if (cmdSQL is null)
        {
            cmdSQL = new
                SqlCommand("SELECT TabID, TabName, Title, CreatedOnDate, TabPath From [tableName].[dbo].[Tabs] Order By TabName");
        }
        var connectionFromConfig = WebConfigurationManager.ConnectionStrings["connstring"].ConnectionString;
        using (cmdSQL)
        {
            cmdSQL.Connection = new SqlConnection(connectionFromConfig);
            cmdSQL.Connection.Open();
            DataTable rst = new DataTable();
            rst.Load(cmdSQL.ExecuteReader());
            dashboard.DataSource = rst;
            dashboard.DataBind();
        }
    }
    }
 

Ответ №1:

Вместо вашего BindDataToGridView() для события подкачки?

Вызовите ТУ ЖЕ процедуру, что и для нажатия кнопки, чтобы отфильтровать даты.

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

Итак, для подкачки вы должны вызвать процедуру с фильтром. Это наводит на мысль, что вы хотите, чтобы одна процедура загружала сетку, и она должна выяснить, есть ли у вас фильтр или нет. Таким образом, вы можете проверить, что дата начала/окончания не заполнена. это позволит как событию загрузки страницы, кнопке фильтра, так и событию изменения страницы данных вызывать ОДНУ общую процедуру.

Итак, несколько вещей:

Если вы собираетесь привязать представление сетки/списка? а пейдж? А фильтр?

(3 вопроса)?

Затем сделайте ОДНУ общую процедуру для всех звонков.

Скажи вот так:

     void BindDataToGridView()
    {
        SqlCommand cmdSQL = new SqlCommand("");

        cmdSQL.CommandText = "SELECT TabID, TabName, Title, CreatedOnDate, TabPath From TableName Order By TabName";

        if (startDate.Text != "")
        {
            // filter
            cmdSQL.CommandText = 
                "SELECT TabID, TabName, Title, CreatedOnDate, TabPath From TableName "  
                "WERE CreatedOnDate >= @Start AND <= @End ORDER By TabName";

            cmdSQL.Parameters.Add("@Start", SqlDbType.Date).Value = startDate.Text;
            cmdSQL.Parameters.Add("@End", SqlDbType.Date).Value = endDate.Text;
        }
        using (cmdSQL)
        {
            cmdSQL.Connection = new SqlConnection(conString);
            cmdSQL.Connection.Open();
            DataTable rst = new DataTable();
            rst.Load(cmdSQL.ExecuteReader());
            dashboard.DataSource = rst;
            dashboard.DataBind();
        }
    }
 

Так что теперь мы НЕ проходим фильтр. Я полагаю, вы могли бы также перевести sql или состояние фильтра в состояние просмотра и проверить это с помощью процедуры фильтрации, но вам лучше сделать это выше.

На самом деле, я часто предлагаю отфильтровать reocrdset от встроенного «представления», так как это может сэкономить попадание в базу данных, но это не имеет значения.

Итак, при введении фильтров? А пейджинг? Вы должны иметь в виду все вышесказанное.

Итак, теперь у нас есть одна процедура для загрузки страницы, нажатия кнопки и изменения кода индекса пейджера.