这篇文章发的仓促,所以没怎么写注释,以后再把注释加上,上篇文章和这篇文章不太一样,以这篇为主!!要明白清楚两个listView的所有事件的含义,其实根本不用写mouseMove,mouseUp事件,那样更费劲。代码里要注意index,尤为重要,它是拖拽到第几个项的索引。还要注意,listview不仅要判断自己内部的拖拽,还要判断外部的拖拽!!
如下图所示:
http://s6/mw690/621e24e2tx6CIEXneCh75&690两个listView内部和相互拖拽,任意位置拖拽,不重复,自动排序" TITLE="C# 两个listView内部和相互拖拽,任意位置拖拽,不重复,自动排序" />
http://s9/mw690/621e24e2tx6CIEXqTKof8&690两个listView内部和相互拖拽,任意位置拖拽,不重复,自动排序" TITLE="C# 两个listView内部和相互拖拽,任意位置拖拽,不重复,自动排序" />
下图的代码可以写在窗体加载事件当中,也可以写在窗体构造函数当中,随意。这里的GiveFeedback事件里面可以编写在拖动时需要的操作,这里没有贴出代码,因为这是告诉大家有这个事件,可以试着写写。这里lvUsers是普通用户,lvAdmins是系统管理员。其实主要是考虑index,摸清它的值,比如:往空的一方拖拽,涉及到index为-1的情况;单方自己拖拽的时候,在拖拽还没完成时鼠标没有移移动到目标位置,而是向空的地方挪,这时index也为-1,所以为-1的情况要处理!注意,不要忘记设置排序器!
顺便说一下,如果有两个listView,你想在点击项时进行对该项的某些操作,比如更新数据库、显示它的子项的值的时候,最好用click事件,而不是indexChange事件,因为点击完了第一个listView的某项,再点击第二个listView的某项,然后再点击刚才第一个listView的那个项,这时是无法触发第一个listView的indexchange事件的,因为它的index没变。
http://s4/middle/621e24e2gc71d519271b3&690两个listView内部和相互拖拽,任意位置拖拽,不重复,自动排序" TITLE="C# 两个listView内部和相互拖拽,任意位置拖拽,不重复,自动排序" />
以下代码为上图代码中的各种事件的详细代码:
void lvUsers_DragLeave(object sender, EventArgs e)
{
lvUsers.InsertionMark.Index = -1;
}
void lvUsers_DragOver(object sender, DragEventArgs e)
{
// 获得鼠标坐标
Point point = lvUsers.PointToClient(new Point(e.X, e.Y));
// 返回离鼠标最近的项目的索引
int index = lvUsers.InsertionMark.NearestIndex(point);
// 确定光标不在拖拽项目上
if (index > -1)
{
Rectangle itemBounds = lvUsers.GetItemRect(index);
if (point.X > itemBounds.Left + (itemBounds.Width /
2))
{
lvUsers.InsertionMark.AppearsAfterItem = true;
}
else
{
lvUsers.InsertionMark.AppearsAfterItem = false;
}