如何只检查checkedlistbox中的一个项目

时间:2011-03-10 08:07:04

标签: c# winforms checkedlistbox

我有一个检查列表框控件,我想一次只选择一个项目,我目前正在使用此代码执行相同操作。

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 个答案:

答案 0 :(得分:2)

我同意上面的评论员 - 你应该考虑使用单选按钮。但是如果你真的需要CheckedListBox,那么请使用这个Item Checked事件处理程序:

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

答案 1 :(得分: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;
        }
    }

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

答案 2 :(得分: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);
}

答案 3 :(得分: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);
    }