单击 Web 窗体 GridView 的下一页时,过滤后的数据会刷新为未过滤的数据
Filtered data refreshes to unfiltered data when clicking next page of web forms GridView
我有一个包含一个过滤器的 Web 表单项目。当用户过滤数据并点击下一页时,过滤器似乎被取下并显示默认数据。我怎样才能解决这个问题?是需要更新的 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();
}
}
}
代替分页事件的 BindDataToGridView()?
调用与按钮点击相同的例程来过滤日期。
(您甚至可以将按钮点击的代码提取到一个单独的例程中。该例程按日期过滤,因此您的按钮点击过滤和页面索引更改事件都调用同一个例程。
因此,对于分页,您必须使用过滤器调用例程。这种暗示你想要一个例程来加载网格,它必须弄清楚你是否有过滤器。因此,您可能会检查 start/end 日期是否为空。这将允许页面加载事件、过滤器按钮和数据页面更改事件都调用一个公共例程。
所以,有几件事:
如果要绑定 grid/list 视图?和页面?和过滤器?
(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,因为这可以节省数据库命中率,但这并不重要。
那么,什么时候引入过滤器?和寻呼?以上几点你要牢记。
所以,现在我们有一个用于页面加载、按钮单击和寻呼机更改索引代码的例程。
我有一个包含一个过滤器的 Web 表单项目。当用户过滤数据并点击下一页时,过滤器似乎被取下并显示默认数据。我怎样才能解决这个问题?是需要更新的 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();
}
}
}
代替分页事件的 BindDataToGridView()?
调用与按钮点击相同的例程来过滤日期。
(您甚至可以将按钮点击的代码提取到一个单独的例程中。该例程按日期过滤,因此您的按钮点击过滤和页面索引更改事件都调用同一个例程。
因此,对于分页,您必须使用过滤器调用例程。这种暗示你想要一个例程来加载网格,它必须弄清楚你是否有过滤器。因此,您可能会检查 start/end 日期是否为空。这将允许页面加载事件、过滤器按钮和数据页面更改事件都调用一个公共例程。
所以,有几件事:
如果要绑定 grid/list 视图?和页面?和过滤器?
(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,因为这可以节省数据库命中率,但这并不重要。
那么,什么时候引入过滤器?和寻呼?以上几点你要牢记。
所以,现在我们有一个用于页面加载、按钮单击和寻呼机更改索引代码的例程。