【问题标题】:Filtered data refreshes to unfiltered data when clicking next page of web forms GridView单击 Web 表单 GridView 的下一页时,过滤的数据会刷新为未过滤的数据
【发布时间】:2021-11-20 13:08:29
【问题描述】:

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

【问题讨论】:

    标签: asp.net webforms


    【解决方案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,因为这样可以节省数据库命中,但这没关系。

    那么,在引入过滤器时?和分页?您必须牢记以上几点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多