0

我有一个包含一个过滤器的 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();
        }
    }
    }
4

1 回答 1

1

代替分页事件的 BindDataToGridView() ?

为单击按钮调用 SAME 例程以过滤日期。

(您甚至可以将按钮单击的代码提取到一个单独的例程中。该例程按日期过滤,因此让您的按钮单击进行过滤,并且页面索引更改事件调用相同的例程。

因此,对于分页,您必须使用过滤器调用例程。这种建议您需要一个例程来加载网格,并且它必须确定您是否有过滤器。因此,您可能会检查开始/结束日期是否为空白。这将允许页面加载事件、过滤器按钮和数据页面更改事件全部调用一个公共例程。

所以,有几点:

如果要绑定网格/列表视图?和页面?和过滤?

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

那么,什么时候引入过滤器呢?和分页?您必须牢记以上内容。

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

于 2021-09-28T16:54:50.573 回答