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 回答