CheckedListBox Действие ItemCheck, чтобы удалить элементы? - PullRequest
0 голосов
/ 03 августа 2011

Когда флажок снят, я хочу удалить этот элемент. Проблема в том, что проверка / снятие галочки, кажется, происходит после вызова метода ItemCheck. Поэтому, когда я удаляю элемент, который портит e.Index, он делает отметку / снятие флажка с элемента после того, который я удаляю, или выдает ошибку, если это последний элемент.

Я нашел это: Как остановить ListView ItemCheck! , у которого есть подсказка сброса e.NewValue, которое частично работает, но все равно выдает ошибку, когда я удаляю последний элемент.

Причина, по которой я не просто использовал одно из событий мыши, заключается в том, что я хочу, чтобы навигация с помощью клавиатуры все еще была возможна на всякий случай.

Вот код, который у меня сейчас есть.

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

Спасибо за помощь

1 Ответ

3 голосов
/ 03 августа 2011

Похоже, единственная проблема, с которой вы все еще сталкиваетесь, - это вызов 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, и оно работает.

...