与gridview的多个复选框组合

本文关键字:复选框 组合 gridview | 更新日期: 2023-09-27 18:03:32

我有一个客户,他想对他们的应用程序进行过滤。一个页面有8个过滤器,另一个有19个。过滤器可以组合。基本上2 ^ n。这根本不是问题,直到它得到一个大的数字,如19!那将是……524288种不同的组合?也许我想错了。

那么,有什么方法可以在不创建那么多代码的情况下完成呢?我的想法最初是这样的:1. 创建所需的复选框数量。2. 使用逻辑(case,if, else等)对检查的更改事件给出所需的gridview视图的sql命令并传递它。

但是这是一个疯狂的编码量,必须有一个更简单的方法,而不是在每个组合上放置标记或检查它是否被选中。

我让它为他们最初想要的5种组合工作,但19?我只是想不出没有大量代码的方法。也许我太累了,有一个简单的答案。

为了澄清,让我们看看8种可能的组合。假设他们有一个客户吃8种不同的食物。1. 鸡蛋2. 培根3.火腿4. 烤面包5. 百吉饼6. 橙汁7. 牛奶8. 苹果

所以过滤可以是:鸡蛋或者鸡蛋和培根或者鸡蛋,熏肉和火腿或鸡蛋和培根和火腿和吐司

或熏肉或者培根和火腿或培根火腿吐司

或火腿或者火腿吐司

等。等等。

如果不检查每个组合是否被选中,我不知道如何做到这一点。我让它在较小的过滤量下工作,但是当数量变大时,排列就会爆炸到疯狂的数量。

编辑——这就是我如何让它在这种情况下为其他人工作的

protected void Page_Load(object sender, EventArgs e)
{
    bindFilter();
}
protected void chkBoxFilters_SelectedIndexChanged(object sender, EventArgs e)
{
    this.bindFilter();
}
private void bindFilter()
{
    string constr = ConfigurationManager.ConnectionStrings["YOUR CONNECTION STRING HERE"].ConnectionString;
    string query =
       "YOUR SQL QUERY HERE";
    string condition = string.Empty;
    foreach (ListItem item in chkBoxFilters.Items)
    {
        condition += item.Selected ? string.Format("'{0}',", item.Value) : string.Empty;
    }
    if (!string.IsNullOrEmpty(condition))
    {
        condition = string.Format(" WHERE COLUMN_NAME IN ({0})", condition.Substring(0, condition.Length - 1));
    }
    using (SqlConnection con = new SqlConnection(constr))
    {
        using (SqlCommand cmd = new SqlCommand(query + condition))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
            {
                cmd.Connection = con;
                using (DataTable dt = new DataTable())
                {
                    sda.Fill(dt);
                    GRIDVIEWID.DataSource = dt;
                    GRIDVIEWID.DataBind();
                }
            }
        }
    }
}

}

当然,创建一个将autopostback设置为true的复选框列表。这对我很有效,如果将来有人遇到类似的事情。如果您要查找多个列,然后在后面添加OR [ColumnName] IN({0}),它也可以工作。您也可以在多个表中使用此过滤器。甜蜜而简单。

与gridview的多个复选框组合

我不确定这是否有帮助,但我以前不得不处理高级搜索页面,并走了这条路…

构建一个充满复选框的页面,获取每个复选框的Checked属性并将其传递给SQL存储过程(可能带有SqlDataSource控件和ControlParameter,如下所示):

CREATE PROC usp_web_search
    @eggs       bit     = NULL,
    @bacon      bit     = NULL,
    @ham        bit     = NULL,
    @toast      bit     = NULL
AS
BEGIN
    SET NOCOUNT ON;
    SELECT      * 
    FROM        myTable a
    WHERE       (@eggs IS NULL OR (a.Eggs = @eggs))
                AND (@bacon IS NULL OR (a.Bacon = @bacon))
                AND (@ham IS NULL OR (a.Ham = @ham))
                AND (@toast IS NULL OR (a.Toast = @toast));
END;

如果有必要,您可以使WHERE逻辑更复杂,但是这样可以处理各种组合。任何参数都可以是NULL(它们将在查询中被忽略),0(未检查;将是查询的一部分),或1(选中;(将是查询的一部分)。

希望对大家有帮助。