【问题标题】:how to check only one item in checkedlistbox如何只检查checkedlistbox中的一项
【发布时间】:2011-03-10 08:07:03
【问题描述】:

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

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

这段代码运行良好。

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

【问题讨论】:

  • 如果您只想选择一项,为什么不使用RadioButtonList?用锯子锯,用螺丝刀拧螺丝……
  • Bazz,确实如此。但我不得不说我“经常”找到这种方法来做一个标签一个复选框的解决方案。任何有充分理由的人,请将其标记给我! (化妆品除外,这是我可以服用的原因)。
  • 我同意 Bazzz 的观点。错误的工作工具。 UX 的一个关键方面是用户非常熟悉某些 UI 提示。多年看到复选框意味着他们希望能够选中多个。如果您强制选中一个复选框,这对用户来说是一种非常不和谐的体验。
  • @Ray Booysen:同意,除此之外,违背流程意味着您最终会遇到编码困难,从而导致在 StackOverflow 上提问:)

标签: c# winforms checkedlistbox


【解决方案1】:

我同意上述评论员的观点 - 您应该考虑使用单选按钮。但如果你真的需要 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;
    }
}

【讨论】:

  • 我认为您必须将e.NewValue = CheckState.Checked; 更改为e.NewValue = CheckState.Unchecked;。否则您将无法取消选中已选择的项目。
  • @ChristianJunk,这就是问题作者想要的 - 至少应始终检查一项。
【解决方案2】:

嗯,这是对我的回答!我无法让上面的代码在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;
        }
    }

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

【讨论】:

    【解决方案3】:

    我发现这段代码很好用

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

    【讨论】:

      【解决方案4】:

      “应始终检查至少一项”

      当前解决方案(最后一个)允许检查项目。如果您的目的是始终只选择一项,请将其用作 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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        • 2020-09-24
        相关资源
        最近更新 更多