0

嗨,我正在制作一个表格,人们可以在其中选中复选框以查看他们已经阅读了哪些项目。如何在不为每个复选框经历大量循环的情况下保存复选框?(总共有 66 个盒子)。

4

5 回答 5

2

您可以使用 Linq 优雅地遍历复选框:

var checkBoxes = Controls.OfType<CheckBox>();

foreach (var chk in checkBoxes)
{
    // Save state
}

Dictionary<string, bool>保存状态的一种简单方法是使用控件名称作为键将选中状态置于 a中。将字典序列化为文件。

所以,

// Save state

可能看起来像这样:

Dictionary<string, bool> state = new Dictionary<string, bool>();

var checkBoxes = Controls.OfType<CheckBox>();

foreach (var chk in checkBoxes)
{
    if (!state.ContainsKey(chk.Name))
    {
        state.Add(chk.Name, chk.Checked);
    }
    else 
    {
        state[chk.Name] = chk.Checked;
    }
}

然后,只需state使用您最喜欢的支持通用字典的序列化程序进行序列化。

于 2012-07-10T05:14:59.147 回答
2

充实我所做的评论,假设所有复选框都在一个控件(表单或面板)上,我称之为“父级”。

    foreach (CheckBox child in parent.Controls)
    {
        if (child == null) // Skip children that are not Checkboxes
          continue;
        // Save the child Checkbox
    }
于 2012-07-10T05:16:58.547 回答
0

您不能序列化表单。如果您有一个在选中或未选中复选框时跟踪的类运行,您可以将其序列化。然后反序列化它以重建表单。

于 2012-07-10T05:14:38.710 回答
0

您可以使用CheckedListbox。通过使用CheckedListBox.CheckedItems属性,您只能获取选中的项目。

private void WhatIsChecked_Click(object sender, System.EventArgs e) {
    // Display in a message box all the items that are checked.

    // First show the index and check state of all selected items.
    foreach(int indexChecked in checkedListBox1.CheckedIndices) {
        // The indexChecked variable contains the index of the item.
        MessageBox.Show("Index#: " + indexChecked.ToString() + ", is checked. Checked state is:" +
                        checkedListBox1.GetItemCheckState(indexChecked).ToString() + ".");
    }

    // Next show the object title and check state for each item selected.
    foreach(object itemChecked in checkedListBox1.CheckedItems) {

        // Use the IndexOf method to get the index of an item.
        MessageBox.Show("Item with title: \"" + itemChecked.ToString() + 
                        "\", is checked. Checked state is: " + 
                        checkedListBox1.GetItemCheckState(checkedListBox1.Items.IndexOf(itemChecked)).ToString() + ".");
    }

}
于 2012-07-10T05:16:10.250 回答
0

您可以处理 CheckBox 的CheckedChanged事件并相应地更新您的局部变量(或列表)。这样,您将始终知道CheckState每个复选框,而不必每次都进行迭代。

    CheckBox box = new CheckBox();
    box.CheckedChanged += new EventHandler(box_CheckedChanged);

    // Event Handler
    void box_CheckedChanged(object sender, EventArgs e)
    {
        if (sender is CheckBox)
        {
            CheckBox cb = (CheckBox)sender;
            bool checkState = cb.Checked;
        }
    }

希望能帮助到你...!!

于 2012-07-10T05:17:19.287 回答