【问题标题】:Drag and Drop between 2 list boxes在 2 个列表框之间拖放
【发布时间】:2009-11-30 21:25:30
【问题描述】:

尝试在 2 个列表框之间实现拖放,到目前为止我看到的所有示例都不是很好闻。

有人可以指点我或向我展示一个好的实现吗?

【问题讨论】:

标签: winforms c#-3.0 drag-and-drop


【解决方案1】:

这是一个示例表单。开始使用新的 WF 项目并在表单上放置两个列表框。使代码如下所示:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      listBox1.Items.AddRange(new object[] { "one", "two", "three" });
      listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
      listBox1.MouseMove += new MouseEventHandler(listBox1_MouseMove);
      listBox2.AllowDrop = true;
      listBox2.DragEnter += new DragEventHandler(listBox2_DragEnter);
      listBox2.DragDrop += new DragEventHandler(listBox2_DragDrop);
    }

    private Point mDownPos;
    void listBox1_MouseDown(object sender, MouseEventArgs e) {
      mDownPos = e.Location;
    }
    void listBox1_MouseMove(object sender, MouseEventArgs e) {
      if (e.Button != MouseButtons.Left) return;
      int index = listBox1.IndexFromPoint(e.Location);
      if (index < 0) return;
      if (Math.Abs(e.X - mDownPos.X) >= SystemInformation.DragSize.Width ||
          Math.Abs(e.Y - mDownPos.Y) >= SystemInformation.DragSize.Height)
        DoDragDrop(new DragObject(listBox1, listBox1.Items[index]), DragDropEffects.Move);
    }

    void listBox2_DragEnter(object sender, DragEventArgs e) {
      DragObject obj = e.Data.GetData(typeof(DragObject)) as DragObject;
      if (obj != null && obj.source != listBox2) e.Effect = e.AllowedEffect;
    }
    void listBox2_DragDrop(object sender, DragEventArgs e) {
      DragObject obj = e.Data.GetData(typeof(DragObject)) as DragObject;
      listBox2.Items.Add(obj.item);
      obj.source.Items.Remove(obj.item);
    }

    private class DragObject {
      public ListBox source;
      public object item;
      public DragObject(ListBox box, object data) { source = box; item = data; }
    }
  }

【讨论】:

    【解决方案2】:

    在 .net 中执行拖放控件的正确方法是在第二个控件的 DragDrop 事件处理程序中运行代码。

    它可能“闻起来”很奇怪,但这就是它在 .NET 中的工作方式。

    【讨论】:

      【解决方案3】:

      谷歌给出了这个:http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx

      这似乎是一个相当合理的教程。如果它闻起来很糟糕,我认为这更多是因为拖放 API 使用起来很尴尬,而不是教程本身很差。

      【讨论】:

        猜你喜欢
        • 2020-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多