CheckListBox SelectedItems.Count并不总是有效

时间:2018-08-02 21:24:42

标签: c#

我有一个包含三个CheckedListBoxes的对话框。

为了使最终用户更容易使用,我有一个“全部”复选框,它将选中“它的”对应列表框中的所有项目。

enter image description here

该功能正常工作。

在将控制权返回给调用表单之前,我要确保用户已在前两个列表复选框中选择了至少一项。

我遇到的问题是用户单击“确定”按钮时遇到的验证码。

如果用户单击列表复选框之一中的单个行,则该列表复选框 selecteditem.count 方法的返回值不为零,而是当我使用列表复选框设置所有行时SetItemChecked 方法为零。

这是我编写的用于选中“所有”复选框时选择所有行的代码。

  // set all the items to be selected.
    private void chkAllFields_CheckedChanged(object sender, EventArgs e)
    {
        bool CheckState = chkAllFields.Checked;

        for (int i = 0; i < checkedListFields.Items.Count; i++)
            checkedListFields.SetItemChecked(i, CheckState);


    }

这是我检查是否已选择至少一行的代码。

// see if any fields have been selected.
        if (checkedListFields.SelectedItems.Count == 0)
        {
            MessageBox.Show("Please select at least one field to include", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            this.DialogResult = DialogResult.None;  // don't allow this form to close
        }
        else

以前有没有人经历过这种情况,如果是这样,有没有办法解决这个问题?

我添加了使用CheckListBox GetItemChecked方法查看是否选择了任何行的逻辑。如果我手动选择一行,这种逻辑可行,但是当我尝试使用SetItemChecked方法以编程方式选择CheckListBox中的所有行时,问题仍然存在。

   // see if any of the rows in the passed items is checked
    private bool AtLeastOneItemsChecked(CheckedListBox ListBox)
    {
        try
        {
            for (int i = 0; i < ListBox.Items.Count; i++)
            {
                if (ListBox.GetItemChecked(i) == true)
                    return true;
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        return false;
    }

1 个答案:

答案 0 :(得分:1)

您可能会混淆selectedchecked

  

与您期望的相反,SelectedItems和   SelectedIndices属性不能确定要检查的项目;   他们确定突出显示哪些项目。

The docs显示了如何检查已检查的条目数的示例:

SELECT a.text, REPLACE(b.text, '**', '')
FROM table1 a
JOIN table2 b
ON b.text NOT REGEXP('\\*\\*[a-z]+\\*\\*') AND a.text LIKE CONCAT('%', b.text, '%') OR
   a.text REGEXP CONCAT('[[:<:]]', REPLACE(b.text, '**', ''), '[[:>:]]')