C# 复选框未按预期工作

C# 复选框未按预期工作,c#,asp.net,webforms,C#,Asp.net,Webforms,我的表格中有三个复选框。问题是,当我全部选中这三个复选框时,我只收到一个复选框。我怎样才能解决这个问题 我的代码: private void button1_Click(object sender, EventArgs e) { ConfigOptions itemToSave = 0; if (autoCapsNames.Checked) { itemToSave |= ConfigOptions.Aut

我的表格中有三个复选框。问题是,当我全部选中这三个复选框时,我只收到一个复选框。我怎样才能解决这个问题

我的代码:

    private void button1_Click(object sender, EventArgs e)
    {
        ConfigOptions itemToSave = 0;

        if (autoCapsNames.Checked)
        {
            itemToSave |= ConfigOptions.AutoCapsStr;
        }

        if (autoSort.Checked)
        {
            itemToSave |= ConfigOptions.IntantOrganization;
        }

        if (showLinesNumbers.Checked)
        {
            itemToSave |= ConfigOptions.ShowLinesNumber;
        }


        SaveConfigs(itemToSave);


    }

谢谢

您的代码可能只将
项设置为保存一次。如果选中了所有复选框,则最终只能保存
showLineNumbers
,因为在每个If语句中都会覆盖itemToSave

你可能想改变一下你的方法。你可以

  • SaveConfigs(itemToSave)if
    语句中编写,从而单独保存每个配置选项
  • 将每个
    项目存储到
    列表中,然后循环浏览列表,最后保存所需内容
  • 这里有一个快速而肮脏的方法让你开始

    private void button1_Click(object sender, EventArgs e)
    {
        List<ConfigOptions> itemsToSave = default(List<ConfigOptions>);
    
        if (autoCapsNames.Checked)
        {
            itemsToSave.Add(ConfigOptions.AutoCapsStr);
        }
    
        if (autoSort.Checked)
        {
            itemsToSave.Add(ConfigOptions.IntantOrganization);
        }
    
        if (showLinesNumbers.Checked)
        {
            itemsToSave.Add(ConfigOptions.ShowLinesNumber);
        }
    
        SaveConfigs(itemsToSave); // You're passing the list, and parsing it within the SaveConfigs method.
    }
    
    private void按钮1\u单击(对象发送者,事件参数e)
    {
    List itemsToSave=默认值(List);
    如果(autoCapsNames.Checked)
    {
    itemsToSave.Add(ConfigOptions.autocapssr);
    }
    如果(已选中自动排序)
    {
    itemsToSave.Add(ConfigOptions.IntantOrganization);
    }
    如果(showLinesNumbers.Checked)
    {
    itemsToSave.Add(ConfigOptions.ShowLinesNumber);
    }
    SaveConfigs(itemsToSave);//您正在传递列表,并在SaveConfigs方法中对其进行解析。
    }
    

    或者,如果要在按位计算中使用
    int
    ,请参阅@Lucas的答案。我个人从来没有这样做过,但他有一个很好的观点。(我今天学到了一些东西)。

    前面的答案应该可以解决您的问题,但它改变了您处理数据的方式。 如果要使用按位或方法(如您现在所做的),请确保正确定义了
    ConfigOptions
    。分配给
    ConfigOptions.autocapstr
    ConfigOptions.IntantOrganization
    ConfigOptions.ShowLinesNumber
    的值的选择方式应确保以独特的方式定义您设置的值

    如果
    ConfigOptions
    是一个
    enum
    ,您可以尝试这样定义它:

    enum ConfigOptions
    {
        AutoCapsStr = 1, 
        IntantOrganization = 2, 
        ShowLinesNumber = 4
    }
    
    if (itemToSave & ConfigOptions.AutoCapsStr != 0)
    {
        //ConfigOptions.AutoCapsStr is set, so do appropriate things here
    }
    
    然后,您可以在
    SaveConfigs
    方法中使用它(或者在加载方法中,如果您只保存数值),以测试如下设置的值:

    enum ConfigOptions
    {
        AutoCapsStr = 1, 
        IntantOrganization = 2, 
        ShowLinesNumber = 4
    }
    
    if (itemToSave & ConfigOptions.AutoCapsStr != 0)
    {
        //ConfigOptions.AutoCapsStr is set, so do appropriate things here
    }
    

    请同时粘贴配置选项代码。SaveConfigs方法代码可能也很有用。他可能没有覆盖itemToSave变量,因为他使用的是|=,而不是=。如果ConfigOptions定义正确,它应该可以工作。我对C语言的掌握程度不如我应该的那样好,但不会将
    =
    翻译成
    itemToSave=itemToSave[或]newItemToSave
    ?在我看来,他想要[和],但
    |&
    将用于删除(而不是添加)/是的,它确实转化为或。这是一个逻辑OR,因此他通过按位ORing累加其他值,即:int i=0;i |=2;i |=8;结果为i==10。您可以这样设置所选位,然后读取它们以查看选择了哪些选项。@ChaseFlorell不,Lucas是对的。这取决于配置选项的定义。@Lucas我现在就听你的!这将是这个问题的一个很好的替代答案。谢谢+1:)。使用OR这种方式不是很直观,但有时会有所帮助。我很高兴这些信息对您有用:)。显然,在这种类型的枚举上使用
    FlagsAttribute
    是个好主意。此外,位移位在这方面也很有用,所以您不必处理计算<代码>枚举配置选项{AutoCapsStr=1