CheckedListBox - Как программно убедиться, что один и только один элемент может быть проверен в любой момент времени? - PullRequest
3 голосов
/ 21 октября 2010

Я хочу использовать CheckedListBox в приложении, где каждый элемент в ListBox - это имя папки на моем жестком диске, а для чтения и записи текстовых файлов в каждую из этих папок и из них я хочу убедиться, чтоодин и только один элемент (папка) может быть выбран в любой момент в CheckedListBox

Как я могу добиться этого с помощью кода на C #?

Спасибо за чтение: -)

Редактирование \ обновление - 22/10/2010 Спасибо всем, кто нашел время ответить - особенно Adrift, чей обновленный код по запросу работает отлично.

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

Всего наилучшего.

1 Ответ

6 голосов
/ 21 октября 2010

Я согласен с комментариями о том, что переключатели будут обычным элементом пользовательского интерфейса, когда «отмечен» только один элемент, но если вы хотите использовать CheckedListBox для своего пользовательского интерфейса, вы можете попробовать что-то вроде этого:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    CheckedListBox.CheckedIndexCollection checkedIndices = checkedListBox1.CheckedIndices;

    if (checkedIndices.Count > 0 && checkedIndices[0] != e.Index)
    {
        checkedListBox1.SetItemChecked(checkedIndices[0], false);
    }
}

Вы также можете установить CheckOnClick в true для CheckedListBox.

Редактировать

Обновлен код дляВаш комментарий, чтобы отменить выбор элемента, если он не отмечен.Проблема в том, что снятие флажка с ранее отмеченного элемента вызывает событие снова.Я не знаю, существует ли стандартный способ справиться с этим, но в приведенном ниже коде я отсоединяю обработчик перед вызовом SetItemCheck, а затем снова присоединяю обработчик.Это кажется чистым способом справиться с этим, и это работает.Если я обнаружу, что есть рекомендуемый способ справиться с этим, я обновлю свой ответ.

HTH

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    CheckedListBox.CheckedIndexCollection checkedIndices = checkedListBox1.CheckedIndices;

    if (checkedIndices.Count > 0)
    {
        if (checkedIndices[0] != e.Index)
        {
            // the checked item is not the one being clicked, so we need to uncheck it.  
            // this will cause the ItemCheck event to fire again, so we detach the handler, 
            // uncheck it, and reattach the handler
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedIndices[0], false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }
        else
        {
            // the user is unchecking the currently checked item, so deselect it
            checkedListBox1.SetSelected(e.Index, false);
        }
    }
}
...