winform中的listbox實現拖拽功能

文章目錄

  • 前言
  • 一、實現


前言

winform中的listBox實現拖拽!


一、實現

winform中的listbox實現拖拽只需要實現四個事件
1、準備兩個listbox控件
在這里插入圖片描述
其中listtarget,AllowDrop屬性設置為True。
2、實現四個事件
2.1MouseDown

//在 MouseDown 事件期間,如果從鼠標位置起鼠標移動的距離大于 SystemInformation.DragSize,則啟動拖動動作。
private void ListSource_MouseDown(object sender, MouseEventArgs e)
{//ListBox中Item項的索引indexOfItemUnderMouseToDrag = listSource.IndexFromPoint(e.X, e.Y);//鼠標懸停在列表框的??有效項??上(即 indexOfItemUnderMouseToDrag不是 -1)if (indexOfItemUnderMouseToDrag != ListBox.NoMatches){//記錄鼠標按下位置,DragSize獲取以鼠標按鈕的按下點為中心的矩形的寬度和高度,在該矩形內不會開始拖動操作。Size dragSize =  SystemInformation.DragSize;//創建一個矩形區域(正方形)。以鼠標按下電為中心,以DragSize為高和寬的矩形。dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);}else{//如果鼠標沒有選中ListBox項,則置矩形區域為空dragBoxFromMouseDown = Rectangle.Empty;}
}

2.2MouseMove

private void ListSource_MouseMove(object sender, MouseEventArgs e)
{/** 鼠標按鈕狀態是用??位標志(bit flags)??存儲的:每個按鈕對應一個二進制位可以同時檢測多個按鈕的狀態&(按位與)操作可以提取特定按鈕的狀態* */if ((e.Button & MouseButtons.Left) == MouseButtons.Left){if (dragBoxFromMouseDown != Rectangle.Empty &&!dragBoxFromMouseDown.Contains(e.X,e.Y)){//傳遞ListBox選中項并觸發DoDragDrop事件(這里可以是ListDragSoure觸發,也可以是ListDragTarget)//DoDragDrop 方法確定當前光標位置下的控件。然后它將檢查該控件是否是有效的放置目標。DragDropEffects dropEffect = listSource.DoDragDrop(listSource.Items[indexOfItemUnderMouseToDrag], DragDropEffects.All | DragDropEffects.Link);if(dropEffect != DragDropEffects.None){listSource.Items.RemoveAt(indexOfItemUnderMouseToDrag);if (indexOfItemUnderMouseToDrag > 0)listSource.SelectedIndex = indexOfItemUnderMouseToDrag - 1;else if (listSource.Items.Count > 0)listSource.SelectedIndex = 0;}}}
}

2.3DragDrop

private void Listtarget_DragDrop(object sender, DragEventArgs e)
{if (e.Data.GetDataPresent(typeof(String))){Object item = e.Data.GetData(typeof(String));if(e.Effect == DragDropEffects.Copy || e.Effect == DragDropEffects.Move){listtarget.Items.Add(item);}}
}

2.4DragEnter

/*
當用戶拖動數據進入目標控件(例如一個ListBox或其他控件)時,此方法會被調用。
通過設置e.Effect = DragDropEffects.Move;,它告訴系統當前控件接受拖放操作,并且操作的類型是“移動”。
這個設置會改變鼠標光標的顯示(通常會顯示一個移動圖標),給用戶視覺反饋,表明松開鼠標后數據將被移動到這里。*/
private void Listtarget_DragEnter(object sender, DragEventArgs e)
{e.Effect = DragDropEffects.Move;
}

2.5綁定事件

private int indexOfItemUnderMouseToDrag;
private Rectangle dragBoxFromMouseDown;
public Form1()
{InitializeComponent();listSource.Items.AddRange(new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" });listSource.MouseDown += ListSource_MouseDown;listSource.MouseMove += ListSource_MouseMove;listtarget.DragDrop += Listtarget_DragDrop;listtarget.DragEnter += Listtarget_DragEnter;
}

效果圖
在這里插入圖片描述
注意:如果你的窗體內未使用Combox控件,則看這篇文章就行了。
如果使用到了Combox控件,建議看一下這篇文章“解決winform中的listbox實現拖拽時,遇到combox控件會閃爍的問題”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92659.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92659.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92659.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用 Docker 安裝并啟動 Redis:從入門到實戰

用 Docker 安裝并啟動 Redis:從入門到實戰Redis 作為一款高性能的鍵值對數據庫,在緩存、會話存儲、消息隊列等場景中被廣泛應用。本文將詳細介紹如何使用 Docker 快速安裝和啟動 Redis,包括基礎配置、數據持久化以及容器管理等核心操作&#…

ansible學習第一天

一:ansible基礎知識1.1 ansible的定義與工作原理簡述ansible是一個自動化運維工具,用于執行自動化任務,包括像配置管理,應用部署,任務執行等等,本質上來說也是基礎設施及代碼工具,通過可讀性較強…

Vue原理與高級開發技巧詳解

Vue 的底層原理、高級用法、性能優化和生態整合 文章目錄Vue 的底層原理、高級用法、性能優化和生態整合一、Vue 雙向綁定原理深度剖析1. Vue 2 實現原理(Object.defineProperty)2. Vue 3 實現原理(Proxy)3. v-model 高級用法二、…

axios的封裝

axios的封裝 在src目錄下新建文件夾utils工具類,文件夾里面新建http.js文件,如果項目涉及到多個基地址可以新建http2.js文件。 import axios from axios;/*** 后端*/// 創建axios實例 const http axios.create({// 1.接口基地址baseURL: http://192.168…

MariaDB 數據庫管理與web服務器

MariaDB 數據庫管理與WEB 服務器 介紹 MariaDB 數據庫介紹 **數據庫,是一個存放計算機數據的倉庫。**這個倉庫是按照一定的數據結構來對數據進行組織和存儲的,我們可以通過數據庫提供的多種方法來管理其中的數據。 數據結構,是指數據的組織形…

分治-歸并-912.排序數組-力扣(LeetCode)

一、題目解析1、將數組排升序2、在不使用任何內置函數的情況下解決問題二、算法原理分治-歸并合并兩個有序數組1、雙指針遍歷兩個合并數組2、將比較后的較小值放到新開數組中3、防止有指針未遍歷完&#xff0c;特殊處理4、將nums中的元素還原三、代碼示例vector<int> tmp…

網絡安全初學者學習心得

看到你對網絡安全學習的興趣&#xff0c;我感到非常振奮&#xff01;這個領域既充滿挑戰又回報豐厚&#xff0c;作為初學者&#xff0c;理清學習內容和方向確實至關重要。下面我將結合多年的行業觀察和指導經驗&#xff0c;為你詳細拆解網絡安全初學者的學習內容并分享一些核心…

防火墻筆記優化版

一、防火墻的核心定義防火墻是一種基于預設安全策略&#xff0c;用于隔離內網與外網、控制網絡流量的安全系統&#xff08;可分為軟件系統或硬件系統&#xff09;。其核心作用包括&#xff1a;流量隔離&#xff1a;物理或邏輯分隔內網、外網及 DMZ 區域&#xff08;DMZ 為內網與…

vue3前端項目cursor rule

cursor rule是什么&#xff0c;以及怎么定義&#xff0c;看這個文章&#xff1a; cursor中定義cursor rules_cursor rules如何編寫-CSDN博客 針對現有一個vue3的前端項目&#xff0c;寫了一份cursor rule&#xff0c;可以作為參考&#xff0c;內容如下&#xff08;僅作為參考&…

基于51單片機紅外遙控定時開關智能家電插座設計

1. 功能介紹 本設計是一款基于 STC8C52 單片機 的智能家電插座系統&#xff0c;集 紅外遙控控制、定時開關控制、自動與手動模式切換、掉電數據保存、液晶顯示、蜂鳴器提示 于一體&#xff0c;能夠方便用戶對家用電器進行精準的定時控制與遠程操作。系統廣泛適用于家用電器、辦…

下一代防火墻組網方案

知識回顧&#xff1a;1.傳統防火墻包括包過濾防火墻、應用網關防火墻、狀態檢測防火墻。2.包過濾防火墻工作在3、4層。3.包過濾防火墻特點&#xff1a;4.應用網關防火墻主要作用&#xff1a;①截取用戶初始化連接請求&#xff0c;對用戶進行認證&#xff1b;②通過ALG能讓多通道…

WEB開發-第二十七天(PHP篇)

DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS開發 PHPStorm : 專業PHP開發IDE PhpStudy &#xff1a;Apache MYSQL環境 Navicat Premium: 全能數據庫管理工 變量覆蓋安全&#xff1a; $GLOBALS&#xff1a;這種全局變量用于在PHP腳本中的任意位置訪…

Lwip深度閱讀-網絡架構

LWIP網絡協議棧詳細介紹 本文的內容基本基于野火的LWIP手冊&#xff0c;和LWIP源碼撰寫。 網絡協議棧概述 從圖片可以看出&#xff0c;網絡協議棧采用分層架構&#xff0c;每一層都有特定的功能和協議。 TCP/IP協議分層模型數據封裝過程MAC數據包 我使用wireShark抓包的時候&am…

嵌入式系統學習Day16(C語言中的位運算)

位運算二進制位的運算嵌入式:通過位運算 控制 硬件運算: 運算規則 & 與 一假則假 | 或 一真則真 ~ 非 真假相對 ^ 異或 相同為假 不同為真 << 左移 表示二進制位的移動 >> 右移 eg:int a 0x55; int b 0x33;0101 0101 //0x55 &am…

Endnote下載,導入曼大 harvard_manchester格式

下載endnote 并激活中國農業科技文獻與信息服務平臺&#xff0c;點擊下載 下載harvard_manchester 格式 Harvard Manchester - Referencing guide at the University of Manchester - Subject guides at University of Manchester 雙擊打開第二步下載的安裝包&#xff08;使用…

【Docker進階實戰】從多容器編排到集群部署

Docker進階實戰&#xff1a;從多容器編排到集群部署 當你已經熟悉Docker的基本操作后&#xff0c;面對的下一個挑戰往往是&#xff1a;如何管理多個容器的協作&#xff1f;如何實現容器的集群化部署與擴展&#xff1f;如何保證服務的高可用&#xff1f; 一、Docker Compose&…

【Linux文件操作】文件操作系統調用

目錄 一、文件創建&#xff08;creat 系統調用&#xff09;? 1.1 函數原型 1.2 參數說明? 1.3 返回值? 1.4 使用示例 二、文件打開&#xff08;open 系統調用&#xff09;? 2.1 函數原型 2.2 參數說明? 2.3 返回值? 2.4 使用示例 三、文件讀寫&#xff08;read 和 write …

FreeRTOS源碼分析六:vTaskDelay vs xTaskDelayUntil任務延時

系列文章目錄 FreeRTOS源碼分析一&#xff1a;task創建&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析二&#xff1a;task啟動&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析三&#xff1a;列表數據結構 FreeRTOS源碼分析四&#xff1a;時鐘中斷處理響應流程 Free…

Linux學習-應用軟件編程(fread/fwrite,流定義相關接口)

freadsize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能按塊從文件讀取數據&#xff0c;從文件中讀 nmemb 個、每個 size 字節的元素&#xff0c;存入 ptr 指向的內存。參數- ptr &#xff1a;存儲讀取數據的內存首地址&#xff08;需提前分配足夠…

IP分片(IP Fragmentation)

目錄 一、核心概念:MTU與分片的必要性 二、IP分片的關鍵字段(IPv4頭部) 三、分片與重組流程 1. 分片過程(發送端或中間路由器) 2. 重組過程(接收端) 四、IPv4與IPv6分片的差異 五、分片的潛在問題與風險 六、總結 一、傳輸效率降低,帶寬開銷增加 二、可靠性降低,數據丟…