发布网友 发布时间:2022-05-18 07:11
共4个回答
热心网友 时间:2022-05-19 18:35
以下内容摘自《C#编程指南》第7章,清华大学出版社2011年1月
例7-6 在窗体添加两个ListBox,接受默认名。程序演示在ListBox控件之间的拖放操作。当拖动启动时,调用DoDragDrop方法。如果鼠标位置移动的距离大于DragSize,则启动拖动动作。IndexFromPoint方法确定拖动项的索引。
在Form1类添加以下变量,将下面的代码放在Form1构造函数的上方:
private int indexOfItemUnderMouseToDrag;
private int indexOfItemUnderMouseToDrop;
private Rectangle dragBoxFromMouseDown;
private Point screenOffset;
首先对拖动源的ListBox添加项目和事件,用属性管理器对源listBox的Items添加one、two、three…等10个项目。展开属性管理器的事件栏,添加与拖动有关的事件,这些事件方法的代码如下:
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
//获取鼠标选择控件的索引
indexOfItemUnderMouseToDrag = listBox1.IndexFromPoint(e.X, e.Y);
if (indexOfItemUnderMouseToDrag != ListBox.NoMatches)
{
Size dragSize = SystemInformation.DragSize;
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
e.Y - (dragSize.Height / 2)), dragSize);
}
else
dragBoxFromMouseDown = Rectangle.Empty;
}
private void listBox1_MouseUp(object sender, MouseEventArgs e)
{
dragBoxFromMouseDown = Rectangle.Empty;
}
private void listBox1_MouseMove(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
if (dragBoxFromMouseDown != Rectangle.Empty &&
!dragBoxFromMouseDown.Contains(e.X, e.Y))
{
screenOffset = SystemInformation.WorkingArea.Location;
DragDropEffects dropEffect = listBox1.DoDragDrop(
listBox1.Items[indexOfItemUnderMouseToDrag],
DragDropEffects.All | DragDropEffects.Link);
if (dropEffect == DragDropEffects.Move)
{
listBox1.Items.RemoveAt(indexOfItemUnderMouseToDrag);
if (indexOfItemUnderMouseToDrag > 0)
listBox1.SelectedIndex = indexOfItemUnderMouseToDrag - 1;
else if (listBox1.Items.Count > 0)
listBox1.SelectedIndex = 0; //选择第一项
} } }
}
private void listBox1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
ListBox lb = sender as ListBox;
if (lb != null)
{
Form f = lb.FindForm();
if (((Control.MousePosition.X - screenOffset.X) < f.DesktopBounds.Left) ||
((Control.MousePosition.X - screenOffset.X) > f.DesktopBounds.Right) ||
((Control.MousePosition.Y - screenOffset.Y) < f.DesktopBounds.Top) ||
((Control.MousePosition.Y - screenOffset.Y) > f.DesktopBounds.Bottom))
{
e.Action = DragAction.Cancel;
} }
}
再对接受拖动对象的listBox2设置属性和事件, AllowDrop属性设置为true,允许接受拖来的项目。
键盘状态在DragOver事件处理程序中计算,以确定基于Shift、Ctrl、Alt或Ctrl+Alt键的状态将发生哪种拖动操作。放置位置也在DragOver事件期间确定。如果要放置的数据不是String,则DragDropEffects中将把DragEventArgs.Effect设置为None。最后,停放状态在dropLocationLabelLabel中显示。
要放置的数据在DragDrop事件处理程序中确定,并且在ListBox中的适当位置添加该String值。如果拖动操作移动到窗体边框的外面,则QueryContinueDrag事件处理程序中将取消拖放操作。
用属性管理器对目的ListBox添加与拖动有关的事件,这些方法的代码如下:
private void listBox2_DragOver(object sender, DragEventArgs e)
{
//检查字符串是否存在,如果不存在拖动不能发生
if (!e.Data.GetDataPresent(typeof(System.String)))
{
e.Effect = DragDropEffects.None;
return;
}
if ((e.KeyState & (8 + 32)) == (8 + 32) &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
//KeyState 8 + 32 = CTL + ALT,连接拖动
e.Effect = DragDropEffects.Link;
else if ((e.KeyState & 32) == 32 && (e.AllowedEffect & DragDropEffects.Link) ==
DragDropEffects.Link)
e.Effect = DragDropEffects.Link;
else if ((e.KeyState & 4) == 4 && (e.AllowedEffect & DragDropEffects.Move) ==
DragDropEffects.Move)
e.Effect = DragDropEffects.Move; //键盘SHIFT状态用于移动
else if ((e.KeyState & 8) == 8 && (e.AllowedEffect & DragDropEffects.Copy) ==
DragDropEffects.Copy)
e.Effect = DragDropEffects.Copy; //CTL KeyState for copy
else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
indexOfItemUnderMouseToDrop =
listBox2.IndexFromPoint(listBox2.PointToClient(new Point(e.X, e.Y)));
}
private void listBox2_DragDrop(object sender, DragEventArgs e)
{
//确保ListBox的项目索引包含在数据中
if (e.Data.GetDataPresent(typeof(System.String)))
{
Object item = (object)e.Data.GetData(typeof(System.String));
//允许拖动和放置取决于effect事件
if (e.Effect == DragDropEffects.Copy || e.Effect == DragDropEffects.Move)
{
//插入项目
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
listBox2.Items.Insert(indexOfItemUnderMouseToDrop, item);
else
listBox2.Items.Add(item);
}
}
}
运行结果如图7-10所示。
热心网友 时间:2022-05-19 19:53
你是说将两个listBox(a,b)里的东西相互添加吧。热心网友 时间:2022-05-19 21:28
foreach (var item in listBox2.Items)
热心网友 时间:2022-05-19 23:19
.com上有好多例子