我做了一个扩展方法来交换CheckedListBox中两个项目的位置。该方法放在静态Utilities类中。问题是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);
答案 0 :(得分:3)
之前我没有使用CheckedListBox
,但如果我不得不冒险猜测它的MSDN文档,我会说你想要使用GetItemCheckedState和{ {3}}方法。但是,这也意味着您必须传递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
;考虑到签名参数的变化,现在更合适。
答案 1 :(得分:1)
也许问题是你应该首先获得实际列表框项目的当前检查状态而不是副本。您已经知道列表框正在管理与项目列表内容分开的支票!
您还应该考虑获取项目A和B的当前检查状态。执行项目交换后,将已检查状态重新应用于这两个项目,以便为两个交换项目保持该状态。