0

こんにちは私は私が作成しているフォームを持っています。そこでは、その人がチェックボックスをオンにして、すでに読んだアイテムを確認できます。チェックボックスごとに大規模なループを実行せずに、チェックボックスを保存するにはどうすればよいですか?(合計66個のボックスがあります)。

4

5 に答える 5

2

Linqを使用すると、チェックボックスをエレガントにループできます。

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

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

Dictionary<string, bool>状態を保存する簡単な方法の1つは、コントロール名をキーとして使用して、チェックされた状態をに配置することです。辞書をファイルにシリアル化します。

それで、

// 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

すべてのチェックボックスが1つのコントロール(フォームまたはパネル)にあると仮定して、私が作成したコメントを具体化します。これを「親」と呼びます。

    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 に答える