【问题标题】:Reorderable items in ObjectListViewObjectListView 中的可重新排序项目
【发布时间】:2012-07-23 14:33:30
【问题描述】:

我正在尝试对 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);
            }
        }
    }

如果我的问题缺少任何信息,请告诉我 - 谢谢!

【问题讨论】:

    标签: c# drag-and-drop objectlistview


    【解决方案1】:

    再一次,当问题被提出时,答案是显而易见的!

    问题出在这一行:

    olv.MoveObjects(index + 1, models);
    

    正如我所说,我尝试在对象列表上使用 Insert 和 Remove,但这不起作用 - 那是因为我忘记了 + 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);
    

    【讨论】:

    • 反对者,请证明。如果花时间分享我的解决方案在这里被认为是错误的,我肯定不会再犯这个错误了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多