2012-04-03 86 views
0

我正在开发一个项目。它的拖放操作是我现在的代码。如何实现拖放操作

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void listBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      listBox1.DoDragDrop(listBox1.SelectedItem.ToString(), DragDropEffects.Move); 
     } 

     private void listBox2_DragEnter(object sender, DragEventArgs e) 
     { 
      e.Effect = e.AllowedEffect; 
     } 

     private void listBox2_DragDrop(object sender, DragEventArgs e) 
     { 
      listBox2.Items.Add(e.Data.GetData(DataFormats.Text)); 
      listBox1.Items.Remove(listBox1.SelectedItem.ToString()); 
     } 

它可以让你添加到第二个列表框,但我试图得到它,你也可以,如果你想移动的项目回第一个列表框。我是否像第一个那样重复第二个列表框的代码,或者是否有一行代码可以添加。还有,如何判断程序是否“不可破解”?谢谢。

+0

一般测试和单元测试可以帮助您找到软件中的缺陷。只要说你不能真正宣布你的应用程序“不可破解”。虽然我确信有人会尝试。 – Yuck 2012-04-03 13:45:29

+0

你尝试了什么? – 2012-04-03 13:52:06

+0

好的,我明白了牢不可破。但是,当试图将项目拖放到不同的列表框时,您将如何去做。 – shan 2012-04-03 14:02:34

回答

2

为了实现拖动&下降的主要问题:是的,你需要创建一个镜像功能为ListBox1中和listbox2处理你已经有了:

  • mouseDown事件处理程序listBox2
  • 一用于listBox1的DragEnter处理程序
  • listBox1的DragDrop处理程序。

此外,您需要确保将这些处理程序分配给表单设计器中的各自事件。

2

难道我重复的代码,第二个列表框中

差不多,是的。虽然你可以简化一下,因为代码将基本相同,方法是让两个列表框在MouseDown,DragEnter和DragDrop中使用相同的处理程序,然后使用发件人确定它是listBox1还是listBox2。

此外,你可能想考虑你的MouseDown处理程序。大多数用户不会希望单击即可立即开始拖动操作。通常您会先查找鼠标,然后在开始拖动之前按住鼠标按钮的同时按下鼠标。

我最常做的是这样的:

private Size dragSize = SystemInformation.DragSize; 
private Rectangle dragBounds = Rectangle.Empty; 

private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     dragBounds = new Rectangle(new Point(e.X - dragSize.Width/2, e.Y - dragSize.Height/2), dragSize); 
    } 
    else 
    { 
     dragBounds = Rectangle.Empty; 
    } 
} 

private void listBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left && dragBounds != Rectangle.Empty && !dragBounds.Contains(e.X, e.Y)) 
    { 
     //start drag 
     listBox1.DoDragDrop(listBox1.SelectedItem.ToString(), DragDropEffects.Move); 
     dragBounds = Rectangle.Empty; 
    } 
} 
1

可能 reapeat的代码,但我倾向于不希望这样做。你的是一个边缘案例;许多只有一行的方法。但是,无论何时我看到代码中的重复,都会向我表明我需要将代码从其他地方取出。如果重复在同一个类中,请将其移到该类上自己的方法。如果重复是在不同的类中,则可以在两个以外的地方找到另一个类,以便放置新方法,或者考虑创建一个两个类都可以共享的新类。在你的情况,如果我决定搬家的代码,我会做这样的事情:

private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    HandleMouseDown(listbox1); 
} 

private void listBox2_DragEnter(object sender, DragEventArgs e) 
{ 
    HandleDragEnter(e); 
} 

private void listBox2_DragDrop(object sender, DragEventArgs e) 
{ 
    HandleDragDrop(listBox1, listBox2, e); 
} 

private void listBox2_MouseDown(object sender, MouseEventArgs e) 
{ 
    HandleMouseDown(listBox2); 
} 

private void listBox1_DragEnter(object sender, DragEventArgs e) 
{ 
    HandleDragEnter(e); 
} 

private void listBox1_DragDrop(object sender, DragEventArgs e) 
{ 
    HandleDragDrop(listBox2, listBox1, e); 
} 


private void HandleMouseDown(ListBox listBox) 
{ 
    listBox.DoDragDrop(listBox.SelectedItem.ToString(), DragDropEffects.Move); 
} 

private void HandleDragEnter(DragEventArgs e) 
{ 
    e.Effect = e.AllowedEffect; 
} 

private void HandleDragDrop(ListBox src, ListBox dst, DragEventArgs e) 
{ 
    dst.Items.Add(e.Data.GetData(DataFormats.Text)); 
    src.Items.Remove(src.SelectedItem.ToString()); 
} 

到移动代码的好处是,如果这些方法发展到多行,可以只改变他们一个地方。当然,对于单线方法,我还会记得我以后可以随时将其移至自己的方法。我的个人偏好是保留原来的两行方法,为第二个列表框复制&粘贴,并将DragDrop处理程序拆分成它自己的方法,就像我上面做的那样。

+0

我明白了。感谢我不得不进入listbox2并添加一些代码。 – shan 2012-04-03 14:48:32