使用VS2005中的VB.NET中的CheckListBox,如何强制选择至少一个项目?
您可以在设计时选择其中一项以使其成为默认项目吗?
处理此方案的验证部分的最佳方法是什么?什么时候应该要求用户勾选其中一个框?
答案 0 :(得分:5)
任何一个想法 - 阻止用户取消选中上一个选中的项目,或者在继续之前验证至少检查了一个项目 - 实现起来相当简单。
<强> 1。确保至少检查一个项目(例如,在表单的Load
事件中):
Private Sub frm_Load(ByVal sender As Object, ByVal e As EventArgs)
clb.SetItemChecked(0, True) ' whatever index you want as your default '
End Sub
<强> 2。向您的ItemCheck
事件处理程序添加一些简单的逻辑:
Private Sub clb_ItemCheck(ByVal sender As Object, ByVal e As ItemCheckEventArgs)
If clb.CheckedItems.Count = 1 Then ' only one item is still checked... '
If e.CurrentValue = CheckState.Checked Then ' ...and this is it... '
e.NewValue = CheckState.Checked ' ...so keep it checked '
End If
End If
End Sub
Private Sub btn_Click(ByVal sender As Object, ByVal e As EventArgs)
' you could also put the below in its own method '
If clb.CheckedItems.Count < 1 Then
MsgBox("You must check at least one item.")
Return
End If
' do whatever you need to do '
End Sub
答案 1 :(得分:2)
您可以,但用户可以随时取消选中它。
我这样做的方法是提交,遍历复选框项并确保至少检查其中一项(在满足您的要求后打破循环,无需处理列表的其余部分。 )
如果检查失败,请显示自定义验证程序。必填字段验证器不适用于“检查列表框”,但您可以在此处查看它们的实现方式:
http://www.codeproject.com/KB/webforms/Validator_CheckBoxList.aspx
答案 2 :(得分:2)
此解决方案应该接近。不是100%,没有简单的方法可以找出项目被添加到空列表中。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上。无需其他代码。
Public Class MyCheckedListBox
Inherits CheckedListBox
Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
REM Ensure at least one item is checked
MyBase.OnEnter(e)
If Me.CheckedIndices.Count = 0 AndAlso Me.Items.Count > 0 Then
Me.SetItemChecked(0, True)
End If
End Sub
Protected Overrides Sub OnItemCheck(ByVal e As ItemCheckEventArgs)
REM Prevent unchecking last item
If Me.CheckedIndices.Count <= 1 AndAlso e.NewValue = CheckState.Unchecked Then e.NewValue = CheckState.Checked
MyBase.OnItemCheck(e)
End Sub
End Class
可选的附加覆盖,确保在首次显示表单时检查项目:
Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
MyBase.OnHandleCreated(e)
If Me.CheckedIndices.Count = 0 AndAlso Me.Items.Count > 0 Then
Me.SetItemChecked(0, True)
End If
End Sub
答案 3 :(得分:1)
陷阱ItemCheck事件并验证是否取消选中最后一个复选框:
private void Form1_Load(object sender, EventArgs e)
{
checkedListBox1.SetItemChecked(0, true);
checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
}
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (CountChecked() == 1 &&
e.NewValue == CheckState.Unchecked &&
e.CurrentValue == CheckState.Checked)
{
checkedListBox1.SetItemChecked(0, true);
}
}
private int CountChecked()
{
int count = 0;
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (checkedListBox1.GetItemChecked(i) == true)
count++;
}
return count;
}
更新:然后你必须进行异步调用以设置项目检查状态。
private delegate void SetItemCallback(int index);
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (checkedListBox1.CheckedIndices.Count == 1 &&
e.NewValue == CheckState.Unchecked &&
e.CurrentValue == CheckState.Checked)
{
int index = checkedListBox1.CheckedIndices[0];
// Initiate the asynchronous call.
SetItemCallback d = new SetItemCallback(this.SetItem);
d.BeginInvoke(index, null, null);
}
}
private void SetItem(int index)
{
if (this.checkedListBox1.InvokeRequired)
{
SetItemCallback d = new SetItemCallback(SetItem);
this.Invoke(d, new object[] { index });
}
else
{
checkedListBox1.SetItemChecked(index, true);
}
}
答案 4 :(得分:0)
验证方案建议:
如果您的winform有一个提交/保存按钮,我希望应用程序在按钮被阻止时显示错误(前提是有一个标签说明应该选择至少一个项目)。错误消息不一定是MessageBox,它可以是一个红色标签,在表单中显示错误描述
如果没有可以按住的按钮,则在用户点击项目时进行验证。使用ItemCheck
事件,检查是否至少检查了一个项目。如果没有,请显示错误标签。
代码:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (checkedListBox1.CheckedIndices.Count == 1 &&
e.NewValue == CheckState.Unchecked &&
e.CurrentValue == CheckState.Checked)
{
//Show error label in red
}
}
答案 5 :(得分:0)
我会使用ItemCheck事件在没有选中至少一个项目时设置Button.Enabled = false
,并在选中至少一个项目时设置Button.Enabled = true
(假设确定按钮)或类似的东西)。