1

我做了一个扩展方法来交换 CheckedListBox 中两个项目的位置。该方法放在静态实用程序类中。问题是 CheckState 不旅行。因此,如果我在列表中将选中的项目向上移动,复选框状态将保持不变,并且移动的项目将从它正在替换的项目中接管 CheckState。

我的代码如下所示:

public static System.Windows.Forms.CheckedListBox.ObjectCollection Swap(this System.Windows.Forms.CheckedListBox.ObjectCollection lstBoxItems, int indexA, int indexB)
{
    if (indexB > -1 && indexB < lstBoxItems.Count - 1)
    {
        object tmpItem = lstBoxItems[indexA];          
        lstBoxItems[indexA] = lstBoxItems[indexB];
        lstBoxItems[indexB] = tmpItem;
    }
    return lstBoxItems;
}

我想要的是这样的(显然不起作用)

public static System.Windows.Forms.CheckedListBox.ObjectCollection Swap(this System.Windows.Forms.CheckedListBox.ObjectCollection lstBoxItems, int indexA, int indexB)
{
    if (indexB > -1 && indexB < lstBoxItems.Count - 1)
    {
        object tmpItem = lstBoxItems[indexA];
        System.Windows.Forms.CheckState state = tmpItem.CheckState;

        lstBoxItems[indexA] = lstBoxItems[indexB];
        lstBoxItems[indexB] = tmpItem;
    }
    return lstBoxItems;
}

代码只是这样调用

myCheckedListBox.Items.Swap(selectedIndex, targetIndex);
4

2 回答 2

3

我以前没有使用CheckedListBox过,但如果我不得不冒险猜测一下 MSDN 文档,我会说你想使用GetItemCheckedStateSetItemCheckedState方法。但是,这也意味着您必须同时传递,CheckedListBox而不仅仅是传递它的.Items ObjectCollection.

public static System.Windows.Forms.CheckedListBox Swap(this System.Windows.Forms.CheckedListBox listBox, int indexA, int indexB)
{
    var lstBoxItems = listBox.Items;
    if (indexB > -1 && indexB < lstBoxItems.Count - 1)
    {
        System.Windows.Forms.CheckState stateA = listBox.GetItemCheckState(indexA);
        System.Windows.Forms.CheckState stateB = listBox.GetItemCheckState(indexB);

        object tmpItem = lstBoxItems[indexA];
        lstBoxItems[indexA] = lstBoxItems[indexB];
        lstBoxItems[indexB] = tmpItem;

        listBox.SetItemCheckState(indexA, stateB);
        listBox.SetItemCheckState(indexB, stateA);
    }
    return listBox;
}

所以很自然你的调用代码会变成这样:

myCheckedListBox.Swap(selectedIndex, targetIndex);

另外,请注意,我的方法也返回输入CheckedListBox而不是ObjectCollection; 考虑到签名参数的变化,认为现在更合适。

于 2013-06-23T11:26:15.740 回答
1

也许问题是您应该首先获取实际列表框项的当前检查状态,而不是从副本中获取。您已经知道列表框正在管理与项目列表内容分开的检查!

您还应该考虑获取项目 A 和 B 的当前选中状态。执行项目交换后,将选中状态重新应用于这两个项目,以便为两个交换项目保持该状态。

于 2013-06-23T11:31:08.070 回答