2017-08-07 91 views
0

我創建了一個由兩個pictureBoxes和兩個標籤組成的控件(稱爲Table)。拖放在自定義控件C#

我試圖將它從面板拖放到另一個面板,但它不起作用。 這是我的代碼:

void TableExampleMouseDown(object sender, MouseEventArgs e) 
    { 
     tableExample.DoDragDrop(tableExample, DragDropEffects.Copy); 
    } 

    void Panel2DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    void Panel2DragDrop(object sender, DragEventArgs e) 
    { 
     panel2.Controls.Add((Table) e.Data.GetData(e.Data.GetFormats()[0])); 
    } 

顯然我在是Panel2設置的AllowDrop爲true。當我點擊Table對象(在panel1中)時,鼠標光標不會改變。它看起來像MouseDown事件不會觸發...

謝謝!

這是我訂閱的處理程序構造函數代碼的一部分:

 this.tableExample.MouseDown += new System.Windows.Forms.MouseEventHandler(this.TableExampleMouseDown); 
     this.label2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Label2MouseDown); 
     this.panel1.DragDrop += new System.Windows.Forms.DragEventHandler(this.Panel1DragDrop); 
     this.panel1.DragEnter += new System.Windows.Forms.DragEventHandler(this.Panel1DragEnter); 
+0

所以放置[** **斷點(https://msdn.microsoft.com/en-us/library/5557y8b4.aspx)在'MouseDown',看看它是否會被觸發或不。 –

+0

我試過了,我看到它不會觸發...相反,如果我在標準控件(如TextBox)上執行相同的操作,則它正確工作... – Pietro

+0

因此,您似乎並未訂閱事件...請參閱下面的答案。 –

回答

0

你似乎已經忘了訂閱MouseDown事件。僅僅寫一個事件hanlder是不夠的。

在事件處理程序或窗體的構造將這個:

tableExample.MouseDown += new MouseEventHandler(TableExampleMouseDown); 

欲瞭解更多信息,請參閱文檔:How to: Subscribe to and Unsubscribe from Events - Microsoft Docs


編輯:

這也可能是你按你的自定義控件的子控件之一。子控件擁有自己的MouseDown事件。

爲了使子控件也提高父控件的MouseDown事件把這個構造自定義控件的

MouseEventHandler mouseDownHandler = (object msender, MouseEventArgs me) => { 
    this.OnMouseDown(me); 
}; 
foreach(Control c in this.Controls) { 
    c.MouseDown += mouseDownHandler; 
} 

編輯2:

基礎的對於您添加到問題中的新代碼,您似乎忘記訂閱的事件:

this.panel2.DragDrop += new System.Windows.Forms.DragEventHandler(this.Panel2DragDrop); 
this.panel2.DragEnter += new System.Windows.Forms.DragEventHandler(this.Panel2DragEnter); 
+0

好的,謝謝。這可能是一個分心錯誤。無論如何,MouseDown事件觸發,但DragEnter和DragDrop仍然不會。或者更好的是,如果我在panel2上拖放一個標籤,它們就可以正常工作,但是當我嘗試拖動tableExample時,仍然沒有任何東西... – Pietro

+0

@Pietro:你能在你的問題中分享更多的代碼嗎?例如窗體構造函數,以便我們可以看到您訂閱哪些事件。 –

+0

我用更多的代碼編輯了我的問題。謝謝 – Pietro