как проверить только один элемент в списке проверенных - PullRequest
0 голосов
/ 10 марта 2011

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

private void CLSTVariable_ItemCheck(object sender, ItemCheckEventArgs e)
{
  // Local variable
  int ListIndex;

  CLSTVariable.ItemCheck -= CLSTVariable_ItemCheck;

  for (ListIndex = 0; 
       ListIndex < CLSTVariable.Items.Count; 
       ListIndex++)
  {        
    // Unchecked all items that is not currently selected
    if (CLSTVariable.SelectedIndex != ListIndex)
    {
      // set item as unchecked
      CLSTVariable.SetItemChecked(ListIndex, false);
    } // if
    else
    {
      // set selected item as checked
      CLSTVariable.SetItemChecked(ListIndex, true);
    }
  } // for
  CLSTVariable.ItemCheck += CLSTVariable_ItemCheck;  
}

этот код работает нормально.

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

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Я согласен с комментаторами выше - вы должны рассмотреть возможность использования радиокнопок. Но если вам действительно нужен CheckedListBox, используйте вместо этого этот обработчик события ItemChecked:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (checkedListBox1.CheckedItems.Count == 1)
    {
        Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
        if (isCheckedItemBeingUnchecked)
        {
            e.NewValue = CheckState.Checked;
        }
        else
        {
            Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }

        return;
    }
}
0 голосов
/ 13 января 2014

Я нашел этот код, он так хорошо работает

private void chkboxmov_ItemCheck(object sender, ItemCheckEventArgs e)
{
    for (int ix = 0; ix < chkboxmov.Items.Count; ++ix)
        if (ix != e.Index)
            chkboxmov.SetItemChecked(ix, false);
}
0 голосов
/ 24 апреля 2012

Ну, это был ответ для меня! Я не мог заставить вышеупомянутый код работать в checkListBox1_ItemCheck. Мне пришлось изменить его часть и включить его в событие checkedListBox1_SelectedIndexChanged. Но я не мог удалить исходный код все вместе. Вот что я добавил ...

private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (checkedListBox1.CheckedItems.Count > 1)
        {
            Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }
    }

В основном, если у вас установлено более 1 флажка, поменяйте последний на новый. Мне любопытно, почему оригинальный код не работал. И почему он должен быть там, чтобы мой новый код работал? Спасибо.

...