C# 10个复选框c中的多个组合#
我如何循环而不写一百万条if语句? 这是一个我弄错的代码示例,因为它只会选中每个框,然后继续下一个框。忘了说所有十个复选框都在一个面板中,它们需要在任意组合中被选中。我不想写大量的&&或| | |我甚至不会数数组合,请帮帮我C# 10个复选框c中的多个组合#,c#,C#,我如何循环而不写一百万条if语句? 这是一个我弄错的代码示例,因为它只会选中每个框,然后继续下一个框。忘了说所有十个复选框都在一个面板中,它们需要在任意组合中被选中。我不想写大量的&&或| | |我甚至不会数数组合,请帮帮我 if (cbxTitle.Checked == true) { searched = "title"; } else if (cbxAuthor.Checked == true) { searched = "author"; } else if (c
if (cbxTitle.Checked == true)
{
searched = "title";
}
else if (cbxAuthor.Checked == true)
{
searched = "author";
}
else if (cbxYear.Checked == true)
{
searched = "year";
}
else if (cbxWeight.Checked == true)
{
searched = "weight";
}
您必须订阅每个复选框的事件
选中复选框后,请执行搜索操作。您必须订阅每个复选框的事件
选中复选框后,执行搜索操作。您可以将if语句替换为:
searched = this.Controls
.OfType<CheckBox>()
.First(x => x.Checked).Name.Substring(3).ToLower();
searched=this.Controls
第()类
.First(x=>x.Checked).Name.Substring(3.ToLower();
这假设了三件事:
复选框
表单的直接子元素,它们不在面板或其他容器中
的值
另外,不要忘记使用using指令包含
System.Linq
名称空间,以便使用Linq
方法(类型
和第一个
)您可以将if语句替换为:
searched = this.Controls
.OfType<CheckBox>()
.First(x => x.Checked).Name.Substring(3).ToLower();
searched=this.Controls
第()类
.First(x=>x.Checked).Name.Substring(3.ToLower();
这假设了三件事:
复选框
表单的直接子元素,它们不在面板或其他容器中
的值
另外,不要忘记使用using指令包含
System.Linq
名称空间,以便使用Linq
方法(of type
和First
)似乎要包含用户选择的所有搜索条件。如果你没有,我肯定会用单选按钮
为了避免没完没了的if
/else
语句,我会在所有复选框
控件上使用foreach
循环,并且——假设变量名称一致——然后可以使用名称的子字符串附加到搜索条件中
因此,您的算法或多或少是:
- 获取类型为复选框的所有控件的列表
- 对于找到的每个控件,如果选中了
,则提取其名称 - 通过删除“cbx”前缀获取此控件表示的搜索条件
- 将此条件附加到“已搜索”字符串
namespace SearchApplication
{
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
public partial class SearchOptionsForm : Form
{
// prefix you used for all your checkboxes
private const string prefix = @"cbx";
// store *all* checkboxes in your form
// if you had other checkboxes in your form,
// you would need to think how you would want to differentiate them
private IEnumerable<CheckBox> searchOptionControls;
// represents all choices made by the user to customize the search type
private string searched;
// since your 'searched' variable is a string,
// you need a filter separator to be able to tell user selections apart
private const string optionSeparator = @";";
public SearchOptionsForm()
{
this.InitializeComponent();
// initialize your collection of checkboxes
this.searchOptionControls = this.Controls.OfType<CheckBox>();
}
}
}
命名空间搜索应用程序
{
使用System.Collections.Generic;
使用System.Linq;
使用System.Windows.Forms;
公共部分类搜索选项表单:表单
{
//用于所有复选框的前缀
私有常量字符串前缀=@“cbx”;
//在表单中存储*所有*复选框
//如果表单中有其他复选框,
//您需要考虑如何区分它们
私有IEnumerable SearchOption控件;
//表示用户为自定义搜索类型所做的所有选择
搜索私有字符串;
//由于“搜索”变量是字符串,
//您需要一个过滤器分隔符来区分用户的选择
私有常量字符串选项分隔符=@“;”;
公共搜索选项表单()
{
this.InitializeComponent();
//初始化复选框集合
this.searchOptionControls=this.Controls.OfType();
}
}
}
下面是她单击“应用”后对用户输入做出反应的代码
命名空间搜索应用程序
{
使用制度;
使用System.Windows.Forms;
公共部分类搜索选项表单:表单
{
///
///使用用户所做的选择更新“搜索”字符串。
///
///“应用”按钮。
///未在此实现中使用。
私有无效ApplyClicked(对象发送方,事件参数e)
{
//每次单击后重置过滤器
this.searched=string.Empty;
//检查所有相关控制措施
foreach(此.searchOptionControl中的var currentOption)
{
//确定用户是否要使用此筛选器
如果(currentOption.Checked)
{
//附加到现有搜索选项
searched+=currentOption.Name.Substring(前缀.Length);
//包括过滤器分离器
搜索+=选项分离器;
}
}
//请注意,字符串中的筛选器顺序与显示顺序不匹配
this.textBoxSearchFilters.Text=已搜索;
}
}
}
您似乎希望包括用户选择的所有搜索条件。如果你没有,我肯定会用单选按钮
为了避免没完没了的if
/else
语句,我会在所有复选框
控件上使用foreach
循环,并且——假设变量名称一致——然后可以使用名称的子字符串附加到搜索条件中
因此,您的算法或多或少是:
- 获取类型为复选框的所有控件的列表
- 对于找到的每个控件,如果选中了
,则提取其名称 - 获取由t表示的搜索条件