我正在使用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();
}
答案 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)