#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 от встроенного «представления», так как это может сэкономить попадание в базу данных, но это не имеет значения.
Итак, при введении фильтров? А пейджинг? Вы должны иметь в виду все вышесказанное.
Итак, теперь у нас есть одна процедура для загрузки страницы, нажатия кнопки и изменения кода индекса пейджера.