【发布时间】:2008-09-21 06:20:04
【问题描述】:
我有一组复选框,我只想允许在任何时候检查设定的数量。如果新选中的复选框使计数超过限制,我希望自动取消选中最旧的复选框。这组复选框都使用如下所示的相同事件处理程序。
我已经使用队列实现了该功能,但是当我必须从队列中间删除一个项目时它非常混乱,我认为有一种更优雅的方式。我特别不喜欢将队列转换为列表,只是为了在将列表转换回队列之前调用一种方法。
- 有没有更好的方法来做到这一点?
- 像我一样重新挂钩事件处理程序是一个好主意吗?
这是代码。
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 用更好的 Queue(Of T) 替代品回答了我的实际问题。然而,关于我取消选中复选框的想法实际上是一个坏主意的论点非常有说服力。我将 Chakrit 的答案保留为已接受,但我对其他答案投了赞成票,因为它们在用户眼中提供了更加一致和可用的解决方案。
【问题讨论】:
标签: .net winforms user-interface