2011-03-10 44 views
0

我有一个检查列表框控件,我想一次只选择一个项目,我目前使用这个代码来做同样的事情。如何检查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; 
} 

此代码工作正常。

,但问题是,当我一次又一次地点击所选项目那么所选的项目不应该不加制止,意味着至少一个项目,应始终检查...

+11

你为什么不使用'RadioButtonList'如果你只想要一个项目选择?使用锯锯和螺丝刀来驱动螺丝...... – Bazzz 2011-03-10 08:10:26

+0

Bazz的确如此。但我不得不说,我经常会找到这种方式来做一个标记一复选框的解决方案。任何有充分理由的人,请将其标记给我! (除了化妆品,这是我可以采取的原因)。 – Independent 2011-03-10 08:14:21

+6

我同意Bazzz。工作错误的工具。 UX的一个关键方面是用户非常熟悉某些UI提示。多年看到复选框意味着他们希望能够检查多个。如果强制执行单个复选框,对用户来说这是一个非常刺激的体验。 – 2011-03-10 08:17:27

回答

2

我上面评论员都 - 你应该考虑使用单选按钮。但是,如果你确实需要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; 
    } 
} 
+0

非常非常感谢Loki ....... – 2011-03-10 09:46:03

+0

我认为你必须将'e.NewValue = CheckState.Checked;'更改为'e.NewValue = CheckState.Unchecked;'。否则,您将无法取消选中已选项目。 – 2012-07-17 08:17:00

+0

@ChristianJunk,这就是问题的作者 - 至少应该检查一个项目。 – 2012-07-17 16:13:51

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

这基本上是,如果你有超过1盒子检查,切换最后一个新的。我很好奇为什么原始代码不起作用。为什么它必须在那里才能让我的新代码工作?谢谢。

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); 
} 
相关问题