2

ObjectListViewにドラッグアンドドロップによる並べ替え機能を実装しようとしています。次のクラスについて考えてみます。

public class MyClass
{
    public string Name { get; set; }
    public MyClass(string name)
    {
        Name = name;
    }
}

再注文は機能しましたが(非常に醜いですが)、List<MyClass>OLVが表示しているものを再注文する方法がわからないようです。OLV Selected Indexの位置にあるMyClassオブジェクトを削除し、新しい位置に挿入しようとしましたが、うまくいきませんでした。

必要に応じて、ビューのドラッグアンドドロップを機能させるために使用したコードを次に示します。

    private void objectListView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
        DoDragDrop(((OLVListItem)e.Item).RowObject, DragDropEffects.Move);
    }

    private void objectListView1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = e.Data.GetDataPresent("Cheeseburger.MyClass") ? DragDropEffects.Move : DragDropEffects.None;
    }

    private void objectListView1_DragOver(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
        var olv = (sender as ObjectListView);
        if(e.Data.GetDataPresent("Cheeseburger.MyClass"))
        {
            var pt = olv.PointToClient(new Point(e.X, e.Y));

            var index = olv.InsertionMark.NearestIndex(pt);
            // Debugging
            Text = index.ToString();
            var node = olv.GetItem(index);

            if (node != null && index != -1)
            {
                node.EnsureVisible();
            }
        }
    }


    private void objectListView1_DragDrop(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
        var olv = (sender as ObjectListView);
        if (e.Data.GetDataPresent("Cheeseburger.MyClass"))
        {
            var draggedObject = e.Data.GetData("Cheeseburger.MyClass") as MyClass;
            var pt = olv.PointToClient(new Point(e.X, e.Y));

            var index = olv.InsertionMark.NearestIndex(pt);
            var node = olv.GetItem(index);

            if (node != null && index != -1)
            {
                var models = new List<MyClass>() { draggedObject };
                olv.MoveObjects(index + 1, models);
            }
        }
    }

私の質問に情報が不足している場合は、私に知らせてください-ありがとう!

4

1 に答える 1

2

もう一度、質問がされたとき、答えは明白です!

問題はこの行でした:

olv.MoveObjects(index + 1, models);

+ 1私が言ったように、私はオブジェクトのリストで挿入と削除を使用しようとしましたが、それはうまくいきませんでした-それは私がメソッドのインデックスを忘れたためですInsert(インデックスが0でない場合のみ、それ以外の場合は最初にドロップすると混乱しますリスト内のアイテム)!

そのセクションの変更されたコードは次のとおりです。

                var selIndex = olv.SelectedIndex;
                var models = new List<MyClass>() { draggedObject };
                if (index != 0) index++;
                olv.MoveObjects(index, models);
                MyClasses.Insert(index,draggedObject);
                MyClasses.RemoveAt(selIndex);
于 2012-07-23T14:55:15.693 に答える