0

我有一个复选框控件,我想一次只选择一个项目,我目前正在使用此代码来做同样的事情。

private void CLSTVariable_ItemCheck(object sender, ItemCheckEventArgs e)
{
  // Local variable
  int ListIndex;

  CLSTVariable.ItemCheck -= CLSTVariable_ItemCheck;

  for (ListIndex = 0; 
       ListIndex < CLSTVariable.Items.Count; 
       ListIndex++)
  {        
    // Unchecked all items that is not currently selected
    if (CLSTVariable.SelectedIndex != ListIndex)
    {
      // set item as unchecked
      CLSTVariable.SetItemChecked(ListIndex, false);
    } // if
    else
    {
      // set selected item as checked
      CLSTVariable.SetItemChecked(ListIndex, true);
    }
  } // for
  CLSTVariable.ItemCheck += CLSTVariable_ItemCheck;  
}

这段代码工作正常。

但问题是,当我一次又一次单击所选项目时,不应取消选中该所选项目,这意味着至少应始终检查一个项目...

4

4 回答 4

3

我同意上面的评论员 - 你应该考虑使用单选按钮。但是,如果您确实需要 CheckedListBox,请改用此 ItemChecked 事件处理程序:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (checkedListBox1.CheckedItems.Count == 1)
    {
        Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
        if (isCheckedItemBeingUnchecked)
        {
            e.NewValue = CheckState.Checked;
        }
        else
        {
            Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }

        return;
    }
}
于 2011-03-10T08:34:29.993 回答
0

嗯,这是对我的回答!我无法让上面的代码在checkedListBox1_ItemCheck 中工作。我不得不修改其中的一部分并将其包含在 checkedListBox1_SelectedIndexChanged 事件中。但我不能一起删除原始代码。这是我添加的...

private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (checkedListBox1.CheckedItems.Count > 1)
        {
            Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }
    }

基本上,如果您选中了多个框,请将最后一个框切换为新框。我很好奇为什么原始代码不起作用。为什么我的新代码必须在那里才能工作?谢谢你。

于 2012-04-24T03:32:14.830 回答
0

我发现这段代码效果很好

private void chkboxmov_ItemCheck(object sender, ItemCheckEventArgs e)
{
    for (int ix = 0; ix < chkboxmov.Items.Count; ++ix)
        if (ix != e.Index)
            chkboxmov.SetItemChecked(ix, false);
}
于 2014-01-13T18:45:06.583 回答
0

“至少应始终检查一项”

当前的解决方案(最后一个)允许检查项目。如果您的目的是始终只选择一项,请将其用作MouseUp事件,

    private void ChklbBatchType_MouseUp(object sender, MouseEventArgs e)
    {
        int index = ((CheckedListBox)sender).SelectedIndex;
        for (int ix = 0; ix < ((CheckedListBox)sender).Items.Count; ++ix)
            if (index != ix) { ((CheckedListBox)sender).SetItemChecked(ix, false);   }
              else ((CheckedListBox)sender).SetItemChecked(ix, true);
    }
于 2019-12-04T14:01:01.110 回答