禁止取消选中 CheckedListBox 上的所有内容

Disallow Uncheck all on a CheckedListBox

我的 checkedlistbox 有一个条件:必须检查一个项目。 这意味着更改检查之前的项目必须取消选中。这样可行。 但是取消勾选应该是不行的。通过在尝试取消选中后查看 GUI,由于 ItemCheck-Method 中的第二个条件,项目仍然被选中。不可能取消选中当前检查,它应该如何。但是在离开 ItemCheck-Method 之后,已检查项目的计数从 1 变为 0 (属性 CheckedItems),即使我可以看到已检查项目。我的代码中缺少某些内容:

      private void myCLB_ItemCheck(object sender, ItemCheckEventArgs e)
      {
         // 1. Checking one will uncheck all other, works perfectly
         if (e.NewValue == CheckState.Checked && myCLB.CheckedItems.Count > 0)
         {
            myCLB.ItemCheck -= myCLB_ItemCheck;
            myCLB.SetItemChecked(myCLB.CheckedIndices[0], false);
            myCLB.ItemCheck += myCLB_ItemCheck;
         }

         // 2. Unchecking without checking another not allowed
         if (myCLB.CheckedItems.Count > 0 &&
             myCLB.CheckedItems[0].Equals((sender as CheckedListBox).SelectedItem))
         {
            e.NewValue = CheckState.Checked;
            return;
         }

         // ... do some business here, depending on the check
      }

顺便说一句:使用单选按钮是不可取的,因为可能需要使用多个检查。在这种情况下,上述约束将被禁用。 我也尝试了第二个条件的其他变体,它们也起作用,除了在 ItemCheck-Method 离开后总是 CheckedItems.Count 从 1 变为 0。我没有找到验证方法。

任何帮助将不胜感激。

正如 Plutonix 建议的那样,您应该考虑检查用户提交表单时实际检查了多少。如果用户选中了框 A 和 B,但后来想要选中框 C 和 D,那么用户很自然地想要取消选中 A 和 B,然后选中 C 和 D。您当前的设计不允许这个。

但是,如果您真的对此深信不疑,我会考虑将 Enabled 属性 设置为 False加载表单或修改复选框。因此,如果任何复选框已被修改,您将检查是否只有一个被选中,如果是,则将其锁定。