1

CheckedListBox 内の 2 つの項目の場所を交換する拡張メソッドを作成しました。メソッドは、静的 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);
4

2 に答える 2

3

以前は使用したことがありませんCheckedListBoxが、MSDN のドキュメントを参照して推測する必要がある場合は、GetItemCheckedState メソッドと SetItemCheckedState メソッドを使用することをお勧めます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 の両方の現在のチェック状態を取得することも検討する必要があります。アイテム スワップを実行した後、チェック状態を 2 つのアイテムに再適用して、スワップされた両方のアイテムのステータスを維持します。

于 2013-06-23T11:31:08.070 に答える