Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 10个复选框c中的多个组合#_C# - Fatal编程技术网

C# 10个复选框c中的多个组合#

C# 10个复选框c中的多个组合#,c#,C#,我如何循环而不写一百万条if语句? 这是一个我弄错的代码示例,因为它只会选中每个框,然后继续下一个框。忘了说所有十个复选框都在一个面板中,它们需要在任意组合中被选中。我不想写大量的&&或| | |我甚至不会数数组合,请帮帮我 if (cbxTitle.Checked == true) { searched = "title"; } else if (cbxAuthor.Checked == true) { searched = "author"; } else if (c

我如何循环而不写一百万条if语句? 这是一个我弄错的代码示例,因为它只会选中每个框,然后继续下一个框。忘了说所有十个复选框都在一个面板中,它们需要在任意组合中被选中。我不想写大量的&&或| | |我甚至不会数数组合,请帮帮我

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();
这假设了三件事:

  • 您至少选中了一个
    复选框
  • 复选框是
    表单的直接子元素,它们不在面板或其他容器中
  • 复选框的名称(不带cbx前缀)是要分配给搜索的
    的值

  • 另外,不要忘记使用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();
    
    这假设了三件事:

  • 您至少选中了一个
    复选框
  • 复选框是
    表单的直接子元素,它们不在面板或其他容器中
  • 复选框的名称(不带cbx前缀)是要分配给搜索的
    的值

  • 另外,不要忘记使用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表示的搜索条件