要實現該功能主要分成如下三步:
1)確定被拖拽的物件:這裡是button(要使得button被單擊之後可以拖拽,那麼必須處理其mousedown事件,同時呼叫其dodragdrop——該函式接受兩個引數:i)要拖動的資料。ii)拖動的效果(該效果是2「目標位置」所能夠接受的效果,是乙個列舉值):
c#**如下:
button1.dodragdrop(button1, dragdropeffects.copy || dragdropeffects.move); //形成拖拽效果,移動+拷貝的組合效果
vb.net頁面**如下:
button1.dodragdrop(button1, dragdropeffects.copy or dragdropeffects.move) '形成拖拽效果,移動+拷貝的組合效果
2)目標位置:這裡是form窗體自身。為了使得和windows資源管理器中實現的檔案拖拽效果一樣(即拖拽乙個檔案到目標位置的中途,滑鼠出現「+」號的效果)。那麼應當處理dragenter事件——即拖拽控制項途中進入form體內把效果設定成copy的效果。
c#**如下:
private void form1_dragenter(system.object sender, system.windows.forms.drageventargs e)
}vb.net頁面**如下:
private sub form1_dragenter(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragenter
if (e.data.getdatapresent(gettype(button))) then '當button被拖拽到winform上時候,滑鼠效果出現
e.effect = dragdropeffects.copy
end if
end sub
同時,為了使得form自身支援接受拖拽傳來的控制項,必須設定其allowdrag=true:
另外,一旦鬆開滑鼠,那麼拖拽過程結束。此時應當處理dragdrop事件,複製乙個按鈕:
c#**如下:
private void form1_dragdrop(system.object sender, system.windows.forms.drageventargs e)
vb.net頁面**如下:
private sub form1_dragdrop(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragdrop
'拖放完畢之後,自動生成新控制項
dim btn as new button
btn.size = button1.size
btn.location = me.pointtoclient(new point(e.x, e.y)) '用這個方法計算出客戶端容器介面的x,y座標。否則直接使用x,y是螢幕座標
me.controls.add(btn)
btn.text = "按鈕" + count.tostring
count = count + 1
end sub
這裡需要注意點:location屬性(指定控制項放置位置的起始點)不能直接用e.x或e.y——因為這是螢幕座標,要根據實際的控制項介面座標進行適度轉換,最簡單方法是——pointtoclient方法。
下面給出完整**:
【介面如下所示】
c#**如下:
using microsoft.visualbasic;
using system;
using system.collections;
using system.collections.generic;
using system.data;
using system.diagnostics;
public class form1
private void button1_mousedown(system.object sender, system.windows.forms.mouseeventargs e)
}private void form1_dragenter(system.object sender, system.windows.forms.drageventargs e)
}private void form1_dragdrop(system.object sender, system.windows.forms.drageventargs e)
public form1()
}vb.net頁面**如下:
public class form1
'計數變數,說明輸出了第n個button
private count as integer = 1
private sub form1_load(sender as system.object, e as system.eventargs) handles mybase.load
me.allowdrop = true '窗體自身支援接受拖拽來的控制項
end sub
private sub button1_mousedown(sender as system.object, e as system.windows.forms.mouseeventargs) handles button1.mousedown
'左鍵的話,標誌位為true(表示拖拽開始)
if (e.button = windows.forms.mousebuttons.left) then
button1.dodragdrop(button1, dragdropeffects.copy or dragdropeffects.move) '形成拖拽效果,移動+拷貝的組合效果
e程式設計客棧nd if
end sub
private sub form1_dragenter(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragenter
if (e.data.getdatapresent(gettype(button))) then '當button被拖拽程式設計客棧到winform上時候,滑鼠效果出現
e.effect = dragdropeffects.copy
end if
end sub
private sub form1_dragdrop(sender as system.object, e as system.windows.forms.drageventargs) handles mybase.dragdrop
'拖放完畢之後,自動生成新控制項
dim btn as new button
btn.size = button1.size
btn.location = me.pointtoclient(new point(e.x, e.y)) '用這個方法計算出客戶端容器介面的x,y座標。否則直接使用x,y是螢幕座標
me.controls.add(btn)
btn.text = "按鈕" + count.tostring
count = count + 1
end sub
end class
本文標題: winform拖拽控制項生成副本的解決方法
本文位址:
C 控制項拖拽Winform
實現拖拽功能需要注意如下幾個事件 1.資料來源的mousedown事件 當滑鼠指標在元件上方並按下滑鼠按鈕時發生 在這個事件中新增資料控制項的dodragdrop方法 2.目標容器的dragenter事件 在滑鼠將某項托到該控制項的工作區時發生 3.目標容器的dragdrop事件 拖放完成時發生 需...
WinForm控制項拖拽類
前言 賣麻辣燙歸來後實在太累,寫 來消遣,最近搞winform,感覺標題欄太醜,就想拖拽窗體,自己寫了個拖拽控制項類,方便自己使用,沒啥技術含量,就是想瞎寫寫,明天列印出來貼在店裡,沒事盯著,緬懷我逝去的程式設計師生涯。public class dragcontrol public dragcont...
Winform中生成自動控制項
前幾天專案需要模擬資料,但是實際裝置還沒有接上,就自己用winform搭建了乙個資料模擬器,生成資料給平台。這裡又乙個需求,就是從資料庫中找出裝置,然後自動生成控制項,勾選就表示開啟該裝置,能上傳資料。主要 如下 foreach var device in devices 這裡其實可以直接new乙個...