Когда я перемещаюсь по списку, почему мои отмеченные элементы становятся непроверенными? - PullRequest
0 голосов
/ 04 января 2009

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

private void buttonMoveDown_Click(object sender, EventArgs e)
{
   int iIndex = checkedListBox1.SelectedIndex;
   if (iIndex == -1)
   {
      return;
   }
   moveListboxItem(checkedListBox1,  iIndex, iIndex + 1);
}

Спасибо

Код для moveListboxItem выглядит следующим образом:

 private void moveListboxItem(CheckedListBox ctl, int fromIndex,int toIndex)
        {
            if(fromIndex == toIndex)
            {
                return;
            }
            if(fromIndex < 0 )
            {
                fromIndex = ctl.SelectedIndex;
            }
            if(toIndex < 0 || toIndex > ctl.Items.Count - 1)
            {
                return;
            }

            object data = ctl.Items[fromIndex];
            ctl.Items.RemoveAt(fromIndex);
            ctl.Items.Insert(toIndex, data);
            ctl.SelectedIndex = toIndex;
}

1 Ответ

3 голосов
/ 04 января 2009

Вам необходимо опубликовать код для moveListBoxItem, чтобы мы могли помочь.

Я подозреваю, что moveListBoxItem выглядит примерно так.

void moveListBoxItem(CheckedListBox list, int oldIndex, int newIndex ) {
  object old = list.Items[oldIndex];
  list.Items.RemoveAt(oldIndex);
  list.Items.Insert(newIndex, old);
}

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

void moveListBoxItem(CheckedListBox list, int oldIndex, int newIndex ) {
  var state = list.GetItemCheckedState(oldIndex);
  object old = list.Items[oldIndex];
  list.Items.RemoveAt(oldIndex);
  list.Items.Insert(newIndex, old);
  list.SetItemCheckedState(newIndex, state);
}

РЕДАКТИРОВАТЬ: Обновление для фактического кода moveListBoxItem. Вам также необходимо распространить CheckState на новый индекс. Удаление этого из коллекции по существу очищает сохраненное состояние.

private void moveListboxItem(CheckedListBox ctl, int fromIndex,int toIndex)
        {
            if(fromIndex == toIndex)
            {
                return;
            }
            if(fromIndex < 0 )
            {
                fromIndex = ctl.SelectedIndex;
            }
            if(toIndex < 0 || toIndex > ctl.Items.Count - 1)
            {
                return;
            }

            object data = ctl.Items[fromIndex];
            CheckState state = ctl.GetItemCheckState(fromIndex);
            ctl.Items.RemoveAt(fromIndex);
            ctl.Items.Insert(toIndex, data);
            ctl.SetItemCheckState(toIndex, state);
            ctl.SelectedIndex = toIndex;
}
...