0

VS2010 にいくつかのチェック ボックス リストを持つ小さなプログラムがあります。ユーザーがリストの 1 つですべてを選択できるようにしたかったので、このループ構造を思いつきました...

private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (e.NewValue == CheckState.Checked)
        {
            Applications.Add(CheckedListBox1.Items[e.Index].ToString());
        }
        else if (e.NewValue == CheckState.Unchecked)
        {
            Applications.Remove(CheckedListBox1.Items[e.Index].ToString());
        } 
    }

private void CheckedListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

        if (CheckedListBox1.SelectedIndex == 0)
        {
            for (int i = 1; i < CheckedListBox1.Items.Count; i++)
            {
                CheckedListBox1.SetItemChecked(i, CheckedListBox1.GetItemChecked(0));
            }
        }
        else
        {
            if (!CheckedListBox1.GetItemChecked(CheckedListBox1.SelectedIndex))
            {
                CheckedListBox1.SetItemChecked(0, false);
            }
        }

    }

問題は、これにより「すべて選択」チェックボックスが出力に追加されることです。最初のチェックボックス (「すべて選択」チェック) を含めないようにループを微調整する方法はありますか、それとも別の方法で行う必要がありますか?

4

1 に答える 1

1

「出力に」が何を意味するのかはかなり不明です。SelectedIndexChanged イベントの使用はあまり適切ではありません。ItemCheck イベントは項目のチェックを通知します。代わりにこれを試してください:

    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
        if (e.Index == 0) {
            for (int item = 1; item < checkedListBox1.Items.Count; item++) {
                checkedListBox1.SetItemChecked(item, true);
            }
            e.NewValue = CheckState.Unchecked;  // Prevent "Check All" from getting checked
        }
    }

とにかく SelectedIndexChanged を使用したい場合でも、このイベント ハンドラーを保持して、アイテムがチェックされないようにします。

于 2011-12-28T19:45:00.130 に答える