C#中如何进行两个listbox之间内容的拖动。请高手指教。谢谢啦!

 我来答
th79d
推荐于2018-01-25 · TA获得超过265个赞
知道小有建树答主
回答量:203
采纳率:0%
帮助的人:256万
展开全部

以下内容摘自《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所示。

梅普文
2011-03-22
知道答主
回答量:4
采纳率:0%
帮助的人:6109
展开全部
你是说将两个listBox(a,b)里的东西相互添加吧。
先选中你要从aListbox中添加到bListbox的内容(这样只能一个个的添加),在判断b中有没有,如果有就不添加否则就添加
将从a中选中的内容赋值给一个字符串的变量名,如:
string str=listboxa.text;
if (lslistboxb.Items.Contains(str))
{
MessageBox.Show("已有!", "消息框");
}
else
{
listboxb.Items.Add(str);
}
也可以将listboxa中全部加到listboxb中(就是一次性全部加过去)!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
打壹个酱油
2018-01-25
知道答主
回答量:1
采纳率:0%
帮助的人:910
展开全部
foreach (var item in listBox2.Items)
            {
                listBox1.Items.Add(item);
            }
            listBox2.Items.Clear();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
woowtaotao
2011-03-22 · 超过38用户采纳过TA的回答
知道小有建树答主
回答量:251
采纳率:0%
帮助的人:127万
展开全部
baidu.com上有好多例子
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式