我有一组复选框,我只想在任何时候检查设定金额。如果新选中的复选框将计数超过限制,我希望自动取消选中最旧的复选框。复选框组都使用下面显示的相同事件处理程序。
我已经使用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回答了我的实际问题,更好地替换了Queue(Of T)。然而,我对取消选中框的想法实际上是一个坏主意的论点是非常有说服力的。我接受了Chakrit的回答,但我已经投了其他答案,因为他们在用户眼中提供了更加一致和可用的解决方案。
答案 0 :(得分:4)
万一你没有想到这种方式。
从可用性的角度来看,大概有一些文字说“点击不超过4个复选框”。
在这种情况下,为什么不简单地保持复选框数量的计数,并防止对第5个框进行任何更改(当然只有3个复选框)。
答案 1 :(得分:3)
有一件事要问自己:你真的想用复选框实现这种行为吗?从用户的角度来看,复选框已经具有易于理解的行为,并且当检查新复选框时,看似随机的框变为未选中状态可能会使普通用户感到非常困惑甚至令人沮丧。
也许会考虑类似带有添加/删除按钮的列表框,其中列表的设计为用户提供了最多(例如)四个项目的视觉提示。作为参考,我正在思考toolbar customizing dialog in IE。
的内容也许不是你想要的答案,但需要考虑的事情。
答案 2 :(得分:2)
我认为您正在寻找LinkedList。
使用AddLast
代替Enqueue
和RemoveFirst
代替Dequeue
,并删除中间的内容,只需使用普通Remove
。
答案 3 :(得分:1)
我之前所做的是有一个多列选择菜单,如下所示:
&LT; ----&GT;
选择:选择 选择1空盒子 - 选择2空盒子 - 选择3空盒子 - 选择4空盒子 -然后人们可以突出显示“choice-1”并点击右键。突然,第二列将由第一列中的项填充。然后,您可以在添加3个选项后禁用箭头,并弹出一条消息,说明“您只能选择三个选项”。与其他选项相比,这更有意义。这对用户来说要容易得多。
答案 4 :(得分:1)
解开是不是一个好主意 像我这样的事件处理程序。
这取决于。
是Windows Forms吗? Windows窗体运行在WinAPI之上,这意味着事件处理程序实际上只是主线程中的消息调度循环调用的函数。因此,这些功能不需要是可重入的,而且是“安全的”。
但是,您必须执行错误处理并捕获任何异常,例如事件处理程序中的失败分配,否则您的应用程序将终止。
答案 5 :(得分:0)
如果您要求用户选择一个选项列表并限制选项数量,那么第一个选择可能是主要选择。
e.g。选择两个,你永远不会有任何你不选择的东西:
您的首选是您的首选吗?
如果要使用复选框,只需在选中第二个复选框时禁用所有未选中的复选框。