0

以下のコードは、リストボックス内の選択されたアイテムをリストボックス内の次のアイテムに移動しますが、チェックされている場合は、選択されたアイテムのチェックを外します。どうすればこれを防ぐことができますか?

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;
}
4

1 に答える 1

3

私たちが支援できるようにするには、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;
}
于 2009-01-04T00:18:15.100 に答える