C#中如何进行两个listbox之间内容的拖动。请高手指教。谢谢啦!
以下内容摘自《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所示。
先选中你要从aListbox中添加到bListbox的内容(这样只能一个个的添加),在判断b中有没有,如果有就不添加否则就添加
将从a中选中的内容赋值给一个字符串的变量名,如:
string str=listboxa.text;
if (lslistboxb.Items.Contains(str))
{
MessageBox.Show("已有!", "消息框");
}
else
{
listboxb.Items.Add(str);
}
也可以将listboxa中全部加到listboxb中(就是一次性全部加过去)!
foreach (var item in listBox2.Items)
{
listBox1.Items.Add(item);
}
listBox2.Items.Clear();