如何要求CheckedListBox至少选择一个项目

时间:2010-05-05 12:35:44

标签: vb.net winforms visual-studio-2005

使用VS2005中的VB.NET中的CheckListBox,如何强制选择至少一个项目?

您可以在设计时选择其中一项以使其成为默认项目吗?

处理此方案的验证部分的最佳方法是什么?什么时候应该要求用户勾选其中一个框?

6 个答案:

答案 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(假设确定按钮)或类似的东西)。