WinForm拖拽控制項生成副本的解決方法

2022-09-26 08:36:09 字數 3670 閱讀 8494

要實現該功能主要分成如下三步:

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乙個...