我正在尝试对ObjectListView实施按拖放重新排序功能。考虑以下课程:
public class MyClass
{
public string Name { get; set; }
public MyClass(string name)
{
Name = name;
}
}
我得到了重新排序的工作(但它非常非常难看),但我似乎无法找出如何重新排序我的List<MyClass>
这是OLV正在显示的内容?我尝试在OLV选择索引的位置删除MyClass对象,并插入新位置,但这不起作用。
如果您需要它,以下是我用于获取View Drag and Drop工作的代码:
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);
}
}
}
如果我的问题缺少任何信息,请告诉我 - 谢谢!
答案 0 :(得分:2)
再一次,当问到这个问题时,答案是显而易见的!
问题在于这一行:
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);