2008-09-21 117 views
0

我有一组复选框,我只希望允许在任何时候检查设定数量。如果新选中的复选框将计数超过极限,我希望最旧的复选框被自动取消选中。这组复选框全部使用下面所示的相同事件处理程序。将一组复选框限制为一定数量的检查

我已经用Queue实现了这个功能,但是当我必须从队列中间删除一个项目并且我认为有一个更优雅的方法时,它非常混乱。我特别不喜欢在将列表转换回队列之前将队列转换为列表来调用一个方法。

  • 有没有更好的方法来做到这一点?
  • 解开钩子是否是一个好主意像我一样重新处理事件处理程序。

这是代码。

private Queue<CheckBox> favAttributesLimiter - new Queue<CheckBox>(); 
private const int MaxFavoredAttributes = 5; 

private void favoredAttributes_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox cb = (CheckBox)sender; 

    if (cb.Checked) 
    { 
     if (favAttributesLimiter.Count == MaxFavoredAttributes) 
     { 
      CheckBox oldest = favAttributesLimiter.Dequeue();     

      oldest.CheckedChanged -= favoredAttributes_CheckedChanged; 
      oldest.Checked = false; 
      oldest.CheckedChanged += new EventHandler(favoredAttributes_CheckedChanged); 
     } 

     favAttributesLimiter.Enqueue(cb); 

    } 
    else // cb.Checked == false 
    {     
     if (favAttributesLimiter.Contains(cb)) 
     { 
      var list = favAttributesLimiter.ToList(); 
      list.Remove(cb); 
      favAttributesLimiter=new Queue<CheckBox>(list); 
     } 
    } 
} 

编辑:
Chakrit回答我的问题,实际与队列(Of T)已更好的替代品。然而,关于取消选中框的想法实际上是一个糟糕的主意这一观点非常令人信服。我已经接受了Chakrit的回答,但我已经投了其他答案,因为他们在用户眼中提供了更加一致和可用的解决方案。

回答

2

我认为您在寻找一个LinkedList

使用AddLast而不是EnqueueRemoveFirstDequeue替代和中间删除的东西,只是用一种正常Remove

+0

那么,这应该是更有效的时候删除项目。 – 2008-09-21 06:31:23

+0

这好多了。谢谢! – 2008-09-21 06:35:35

4

以防万一你没有想到它这样。

从可用性的角度来看,大概你有一些文字说“像不超过4个复选框”。

在这种情况下,为什么不简单地保留选中框的数量并防止对第5框进行任何更改(直到当然只有3个复选框)。

3

有一点要问自己:你真的想用复选框来实现这种行为吗?从用户的角度来看,复选框已经有了一个很好理解的行为,并且在检查新复选框时看似随机的框会被忽略,这可能会让普通用户感到非常困惑或者甚至令人沮丧。

也许会考虑像添加/删除按钮的列表框,其中列表的设计给用户一个视觉提示,即有最多的(说)四个项目。作为参考,我正在考虑沿着toolbar customizing dialog in IE的方向发展。

也许不是你要找的答案,而是要考虑的事情。

1

什么我以前做的是有这样一个多选择菜单:

                      < ---->

选择:选择 选择-1空盒 - 选择2 - 空盒 - 选择3 - 空盒 - 选择-4空箱 -                                  

然后人们可以突出一个 “选择-1” 并点击右键。突然第二列将由第一列中的项目填充。然后,您可以在添加3个选项后禁用箭头,并弹出一条消息,说:“您只能选择三种选择。”与其他选项相比,这更有意义。这对用户来说会容易得多。

0

如果您要求用户从选项列表中选择并限制选项的数量,则可能首选选项是主要选项。

例如选择两个,你将永远不会有任何的你不选择什么:

  • 电源
  • 性别
  • 兴奋
  • 小工具
  • 编码器的军队。

是您首选的首选吗?

如果您想使用复选框,只需在第二个选中时禁用所有未选中的复选框。

1

解除链接是否是一个好主意,请回拨 像我这样的事件处理程序。

这取决于。

它是Windows窗体吗? Windows窗体运行在WinAPI之上,这意味着事件处理程序实际上只是主线程中消息分派循环所调用的一个函数。因为这些功能不需要重新进入并且是“安全的”。

但是,你必须做你的错误处理,并捕获任何例外,如失败的分配您的事件处理程序或您的应用程序将终止。

相关问题