2012-04-03 83 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