【问题标题】:checkbox does not working as expected复选框未按预期工作
【发布时间】:2012-02-18 21:24:36
【问题描述】:

我的表单中有三个复选框。问题是当我检查所有三个时,我只收到一个复选框。我怎样才能解决这个问题?

我的代码:

    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);


    }

谢谢

【问题讨论】:

  • 请同时粘贴 ConfigOptions 代码。 SaveConfigs 方法代码也可能会有所帮助。

标签: c# asp.net webforms


【解决方案1】:

上一个答案应该可以解决您的问题,但它会改变您处理数据的方式。 如果您想使用按位或方法(就像您现在所做的那样),请确保您已正确定义 ConfigOptions。分配给ConfigOptions.AutoCapsStrConfigOptions.IntantOrganizationConfigOptions.ShowLinesNumber 的值应选择为以独特的方式定义您设置的值。

如果ConfigOptionsenum,您可以尝试这样定义:

enum ConfigOptions
{
    AutoCapsStr = 1, 
    IntantOrganization = 2, 
    ShowLinesNumber = 4
}

然后,您可以在 SaveConfigs 方法中(或在您的加载方法中,如果您只保存数值)使用它来测试如下设置的值:

if (itemToSave & ConfigOptions.AutoCapsStr != 0)
{
    //ConfigOptions.AutoCapsStr is set, so do appropriate things here
}

【讨论】:

  • 感谢 +1 :)。以这种方式使用 OR 不是很直观,但有时会有所帮助。我很高兴这些信息对你有用:)。
  • 显然在这种类型的枚举上使用FlagsAttribute 是个好主意。 stackoverflow.com/a/8480/124069
  • 此外,位移在这方面也很有用,因此您不必处理计算。 enum ConfigOptions{AutoCapsStr = 1 << 0, IntantOrganization 1 << 1, ShowLinesNumber 1 << 2}
【解决方案2】:

您的代码可能只设置了一次itemToSave。如果您的所有复选框都被选中,您最终可能只保存showLineNumbers,因为您正在通过每个 if 语句覆盖 itemToSave。

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

  1. SaveConfigs(itemToSave); inside 每个if 语句,从而单独保存每个配置选项。
  2. 将每个itemToSave 存储在List<T> 中,然后循环遍历列表,最后保存您需要的内容。

这里有一个快速而肮脏的方法让你开始

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.
}

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

【讨论】:

  • 他可能没有覆盖 itemToSave 变量,因为他使用的是 |=,而不是 =。如果 ConfigOptions 定义正确,它应该可以工作。
  • 我对 C# 的了解不如我应有的那么好,但 |= 不会翻译成 itemToSave = itemToSave [OR] newItemToSave 吗?在我看来,他想要 [AND],但 |&amp; 将用于删除(而不是添加)。 /re Jon Skeet
  • 是的,它确实转换为 OR。这是一个逻辑或,所以他通过按位或对它们进行累积添加其他值,即:int i = 0;我|=2;我|=8;结果给你 i == 10。您可以通过这种方式设置选定的位,然后读取它们以查看选择了哪些选项。
  • @ChaseFlorell 不,卢卡斯是对的。这取决于 ConfigOptions 的定义。
  • @Lucas 我现在跟着你!这将是这个问题的一个很好的替代答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2019-08-30
  • 2018-03-02
  • 2019-11-03
  • 2010-11-24
  • 1970-01-01
相关资源
最近更新 更多