使用Checkboxes以编程方式过滤GridView

时间:2017-08-18 16:47:23

标签: c# asp.net gridview checkbox filter

我正在使用C#为我的代码隐藏创建项目跟踪器ASP.net wbsite。我的默认视图有一个查询SQL Server数据库的GridView,其中一个列是项目状态(ProjStatus),它可以有5个不同的选项(进行中,待定,完成,推迟,取消)。

现在,我需要使用复选框列表创建增量过滤器。例如,如果我选中“正在进行”的复选框,我只想查看“进行中”项目,但如果我也选中“待定”复选框,那么我希望看到两者等等。

我之前只有3个状态(正在进行,待定和完成)我通过使用if语句对每个复选框组合进行硬编码来解决这个问题,但是因为现在有5个可能的组合太多而且我需要太长时间要做到这一点。有什么建议在我的代码隐藏中以编程方式执行此操作吗?

谢谢!

编辑:

我之前使用的是RadioButtons,但我今天早些时候必须根据经理的要求进行更改。这是我以前使用的代码,结合SQLDataSource上的FilterExpression

        if (radioStatus.SelectedItem.Value == "Active")
        {
            SqlDataSource1.FilterExpression = "[PROJ_STATUS] = 'Active'";
            GridView1.DataBind();
        }
        else if (radioStatus.SelectedItem.Value == "Pending")
        {
            SqlDataSource1.FilterExpression = "[PROJ_STATUS] = 'Pending'";
            GridView1.DataBind();
        }
        else if (radioStatus.SelectedItem.Value == "Postponed")
        {
            SqlDataSource1.FilterExpression = "[PROJ_STATUS] = 'Postponed'";
            GridView1.DataBind();
        }
        else if (radioStatus.SelectedItem.Value == "Cancelled")
        {
            SqlDataSource1.FilterExpression = "[PROJ_STATUS] = 'Cancelled'";
            GridView1.DataBind();
        }
        else
        {
            SqlDataSource1.FilterExpression = "[PROJ_STATUS] = 'Complete'";
            GridView1.DataBind();
        }

2 个答案:

答案 0 :(得分:0)

你的解释缺乏一些实现细节,但逻辑应该相对类似。对于少量的复选框,我相信您可以使用Linq这种方式,而无需将复选框映射到相应的属性(在具有许多属性的方案中,您可以这样做以保持代码DRY)。

List<Project> allProjects = yourQuery.ToList(); // Assuming "Project" is your type
List<Project> filteredProjects = new List<Project>(); 

if (inProgressCheckBox.IsChecked)
    filteredProjects.AddRange(allProjects.Where(p => p.InProgress));
if (pendingCheckBox.IsChecked)
    filteredProjects.AddRange(allProjects.Where(p => p.Pending));
if (completeCheckBox.IsChecked)
    filteredProjects.AddRange(allProjects.Where(p => p.Complete));
if (postponedCheckBox.IsChecked)
    filteredProjects.AddRange(allProjects.Where(p => p.Postponed));
if (cancelledCheckBox.IsChecked)
    filteredProjects.AddRange(allProjects.Where(p => p.Cancelled));

filteredProjects = filteredProjects.Distinct();

这不是优化的,但它应该做得很好。您只需将filteredProjects绑定到网格的数据源即可。

答案 1 :(得分:0)

假设您已选中project_status复选框为InProgrss,待定和完成,然后将string表达式,分隔为InProgress,Pending,Complete

CheckBoxList projects = (CheckBoxList)GridView1.Rows[e.RowIndex].FindControl("CheckBoxList1");

List<string> projectsList = new List<string>();

string expression = "";

foreach (ListItem item in projects.Items)
{
    if (item.Selected)
        projectsList.Add(item.Text);
}

expression = string.Join(",", projectsList); // add , inside projects (InProgress,Pending,Complete)