与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}),它也可以工作。您也可以在多个表中使用此过滤器。甜蜜而简单。
我不确定这是否有帮助,但我以前不得不处理高级搜索页面,并走了这条路…
构建一个充满复选框的页面,获取每个复选框的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(选中;(将是查询的一部分)。
希望对大家有帮助。