我有一组复选框,我只希望允许在任何时候检查设定数量。如果新选中的复选框将计数超过极限,我希望最旧的复选框被自动取消选中。这组复选框全部使用下面所示的相同事件处理程序。将一组复选框限制为一定数量的检查
我已经用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的回答,但我已经投了其他答案,因为他们在用户眼中提供了更加一致和可用的解决方案。
那么,这应该是更有效的时候删除项目。 – 2008-09-21 06:31:23
这好多了。谢谢! – 2008-09-21 06:35:35