下面是一个我自己写的在listbox中通过拖动进行排序的代码,希望对初学者有点儿用(其实我也是初学者),呵呵,不多说了,直接贴代码了,都有说明的,稍微看下就明白了
在以下内容中lstChildMenu我的ListBox的name
AppGIMenusMod是我自己定义的一个模型 有ID和MenuName属性,这个模型大家可以自己随便定义
indexofsource和indexoftarget是自定义的int型 的全局变量
ListBox中的DragDrop事件代码:
private void lstChildMenu_DragDrop(object sender, DragEventArgs e)
{
ListBox listbox = (ListBox)sender;
indexoftarget = listbox.IndexFromPoint(listbox.PointToClient(new Point(e.X, e.Y)));
if (indexoftarget != ListBox.NoMatches)
{
object obj = listbox.Items[indexofsource];
List<AppGIMenusMod> lstMenus = (List<AppGIMenusMod>)listbox.DataSource;
AppGIMenusMod modMenu = new AppGIMenusMod();
modMenu = lstMenus[indexofsource];
lstMenus.RemoveAt(indexofsource);//从数据源中移除当前拖动项
lstMenus.Insert(indexoftarget, modMenu);//拖动项重新插入到数据源指定位置
lstChildMenu.DataSource = null;//这句一定要写,我不知道是什么原因,我一直以为winform中数据源回自动更新,可是如果我不释放一下数据源就算排好序,Listbox中也不会显示
lstChildMenu.DisplayMember = "MenuName";
lstChildMenu.ValueMember = "ID";
lstChildMenu.DataSource = lstMenus;//重新设置数据源
lstChildMenu.SelectedIndex = indexoftarget;
}
}
ListBox中的DragOver事件代码:
private void lstChildMenu_DragOver(object sender, DragEventArgs e)
{
//拖动源和放置的目的地一定是一个ListBox
if (e.Data.GetDataPresent(typeof(System.String)) && ((ListBox)sender).Equals(lstChildMenu))
{
e.Effect = DragDropEffects.Move;
}
else
e.Effect = DragDropEffects.None;
}
ListBox中的MouseDown事件代码:
private void lstChildMenu_MouseDown(object sender, MouseEventArgs e)
{
indexofsource = ((ListBox)sender).IndexFromPoint(e.X, e.Y);
if (indexofsource != ListBox.NoMatches)
{
((ListBox)sender).DoDragDrop(((ListBox)sender).Items[indexofsource].ToString(), DragDropEffects.Move);
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Missna/archive/2010/04/30/5546223.aspx