【问题标题】:Filtering a GridView programatically with Checkboxes使用复选框以编程方式过滤 GridView
【发布时间】:2017-08-18 16:47:23
【问题描述】:

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

现在,我需要使用复选框列表创建增量过滤器。例如,如果我选择“In Progress”复选框,我只想查看“In Progress”项目,但如果我还选中“Pending”复选框,那么我希望同时查看两者等等。

我之前只有 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();
        }

【问题讨论】:

  • 我可以看看你尝试了什么吗?
  • 我用我的代码添加了一个编辑,但是,这是我之前使用单选按钮实现的解决方案,因此没有增量过滤,因为您只能选择一个选项(故意)
  • 这是一个从复选框中选中多个过滤器值的案例?

标签: c# asp.net gridview checkbox filter


【解决方案1】:

您的解释缺少一些实现细节,但无论如何逻辑应该相对相似。对于少量复选框,我相信您可以通过这种方式使用 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 绑定到网格的数据源即可。

【讨论】:

    【解决方案2】:

    假设您已将 project_status 复选框选中为 InProgrss、Pending 和 Complete,然后制作一个由 , 分隔的 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2010-11-27
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多