2

チェックされているボックスがチェックされていない場合、その項目を削除したい。問題は、ItemCheck メソッドが呼び出された後にチェック/チェック解除が行われるようです。そのため、e.Index を台無しにする項目を削除すると、削除した項目の後に項目のチェック/チェック解除が行われるか、最後の項目である場合はエラーがスローされます。

私はこれを見つけました: ListView ItemCheck を停止する! 部分的に機能する e.NewValue をリセットするヒントがありますが、最後のアイテムを削除するとエラーがスローされます。

マウス イベントの 1 つを単純に使用しなかった理由は、念のためキーボード ナビゲーションを引き続き使用できるようにしたいからです。

ここに私が今持っているコードがあります。

private void checked_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Unchecked)
            {
                checked.Items.RemoveAt(e.Index);
                e.NewValue = CheckState.Checked;
            }
        }

助けてくれてありがとう

4

1 に答える 1

4

e.NewValueまだ発生している唯一の問題は、最後のアイテムを削除した後の呼び出しですよね? その場合は、これを試してください:

private void checked_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (e.NewValue == CheckState.Unchecked)
    {
        checked.Items.RemoveAt(e.Index);

        // If there are no items left, skip the CheckState.Checked call
        if (checked.Items.Count > 0)
        {
            e.NewValue = CheckState.Checked;
        }             
    }
} 

アップデート

わかりました-どれだけきれいかはわかりませんが、動作するようになりました。SelectedIndexChanged イベントを使用しました。

private void checked_SelectedIndexChanged(object sender, EventArgs e)
{

    CheckedListBox clb = (CheckedListBox)sender;
    int index = clb.SelectedIndex;

    // When you remove an item from the Items collection, it fires the SelectedIndexChanged
    // event again, with SelectedIndex = -1.  Hence the check for index != -1 first, 
    // to prevent an invalid selectedindex error
    if (index != -1 && clb.GetItemCheckState(index) == CheckState.Unchecked)
    {
        clb.Items.RemoveAt(index);
    }
}

VS 2010 でこれをテストしましたが、動作します。

于 2011-08-02T22:39:54.030 に答える