单击 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,因为这可以节省数据库命中率,但这并不重要。

那么,什么时候引入过滤器?和寻呼?以上几点你要牢记。

所以,现在我们有一个用于页面加载、按钮单击和寻呼机更改索引代码的例程。