Winform中實現向窗體中拖放照片並顯示以及拖放文件夾顯示樹形結構(附代碼下載)

来源:https://www.cnblogs.com/badaoliumangqizhi/archive/2019/12/12/12027848.html
-Advertisement-
Play Games

場景 向窗體中拖拽照片並顯示效果 向窗體中拖拽文件夾並顯示樹形結構效果 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 新建一個窗體,在窗體中拖拽一個Panel控制項,再在P ...


場景

向窗體中拖拽照片並顯示效果

 

 

向窗體中拖拽文件夾並顯示樹形結構效果

 

 

註:

博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關註公眾號
霸道的程式猿
獲取編程相關電子書、教程推送與免費下載。

實現

新建一個窗體,在窗體中拖拽一個Panel控制項,再在Panel控制項上拖拽一個TreeView,然後再新增一個右鍵控制項,添加兩個選項-拖放照片和拖放文件夾。

 

 

並分別設置兩個滑鼠右鍵選項的Tag屬性分別為1和2。

Form1.Designer.cs代碼

private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.panel_face = new System.Windows.Forms.Panel();
            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
            this.Tool_Ima = new System.Windows.Forms.ToolStripMenuItem();
            this.Tool_File = new System.Windows.Forms.ToolStripMenuItem();
            this.treeView1 = new System.Windows.Forms.TreeView();
            this.panel_face.SuspendLayout();
            this.contextMenuStrip1.SuspendLayout();
            this.SuspendLayout();
            // 
            // panel_face
            // 
            this.panel_face.ContextMenuStrip = this.contextMenuStrip1;
            this.panel_face.Controls.Add(this.treeView1);
            this.panel_face.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panel_face.Location = new System.Drawing.Point(0, 0);
            this.panel_face.Name = "panel_face";
            this.panel_face.Size = new System.Drawing.Size(391, 238);
            this.panel_face.TabIndex = 0;
            this.panel_face.Visible = false;
            this.panel_face.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
            // 
            // contextMenuStrip1
            // 
            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.Tool_Ima,
            this.Tool_File});
            this.contextMenuStrip1.Name = "contextMenuStrip2";
            this.contextMenuStrip1.Size = new System.Drawing.Size(153, 70);
            // 
            // Tool_Ima
            // 
            this.Tool_Ima.Name = "Tool_Ima";
            this.Tool_Ima.Size = new System.Drawing.Size(152, 22);
            this.Tool_Ima.Tag = "1";
            this.Tool_Ima.Text = "拖放圖片";
            this.Tool_Ima.Click += new System.EventHandler(this.Tool_Ima_Click);
            // 
            // Tool_File
            // 
            this.Tool_File.Name = "Tool_File";
            this.Tool_File.Size = new System.Drawing.Size(152, 22);
            this.Tool_File.Tag = "2";
            this.Tool_File.Text = "拖放文件夾";
            this.Tool_File.Click += new System.EventHandler(this.Tool_Ima_Click);
            // 
            // treeView1
            // 
            this.treeView1.AllowDrop = true;
            this.treeView1.ContextMenuStrip = this.contextMenuStrip1;
            this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.treeView1.Location = new System.Drawing.Point(0, 0);
            this.treeView1.Name = "treeView1";
            this.treeView1.Size = new System.Drawing.Size(391, 238);
            this.treeView1.TabIndex = 0;
            this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick);
            this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
            // 
            // Form1
            // 
            this.AccessibleRole = System.Windows.Forms.AccessibleRole.None;
            this.AllowDrop = true;
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(391, 238);
            this.ContextMenuStrip = this.contextMenuStrip1;
            this.Controls.Add(this.panel_face);
            this.Name = "Form1";
            this.Text = "向窗體中拖放圖片並顯示";
            this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
            this.panel_face.ResumeLayout(false);
            this.contextMenuStrip1.ResumeLayout(false);
            this.ResumeLayout(false);

        }

 

然後綁定兩個滑鼠右鍵的點擊事件為同一個事件。

 private void Tool_Ima_Click(object sender, EventArgs e)
        {
            SetDragHandle(sender, treeView1);
        }

 

然後在點擊事件中調用方法SetDragHandle進行Panel或者TreeView的顯示控制。

Var_Style標識變數為true表示是拖拽照片模式,否則為拖拽文件夾模式。

public void SetDragHandle(object sender, TreeView TV)
        {
            //獲取Tag標簽內容
            switch (Convert.ToInt16(((ToolStripMenuItem)sender).Tag.ToString()))
            {
                case 1:
                    {
                        //讓面板隱藏
                        panel_face.Visible = false;
                        //設置標識變數為true,true表示是拖拽圖片模式
                        Var_Style = true;
                        break;
                    }
                case 2:
                    {
                        this.Width = 399;
                        this.Height = 272;
                        panel_face.Visible = true;
                        Var_Style = false;
                        break;
                    }
            }
        }

 

兩個滑鼠右鍵的點擊事件就是如上進行標識變數的設置,進而知道下一步要進行的操作是啥。

然後綁定panel和treeView以及窗體的拖拽事件為同一個事件

 private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            //在窗體背景中顯示拖拽的照片
            SetDragImageToFrm(this, e);
            //清除treeView的所有節點
            treeView1.Nodes.Clear();
            //向TreeView控制項添加被拖拽的文件夾的目錄
            SetDragImageToFrm(treeView1, e);
        }

 

在拖拽事件中執行三個操作方法,分別為在窗體背景中顯示拖拽的照片的SetDragImageToFrm,清除treeView的

所有節點以及向treeView控制項中添加被拖拽的文件夾的目錄。

在方法SetDragImageToFrm中,首先會根據是否是拖拽照片的標識變數進行判斷

如果是拖拽照片模式則獲取拖拽照片的路徑並將當前窗體的背景照片設置為拖拽的照片。

public void SetDragImageToFrm(Form Frm, DragEventArgs e)
        {
            //如果顯示照片的標識變數為true
            if (Var_Style == true)
            {
                //設置拖放操作中目標放置類型為複製
                e.Effect = DragDropEffects.Copy;
                String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);
                string tempstr;
                Bitmap bkImage;
                //獲取拖拽圖片的路徑
                tempstr = str_Drop[0];
                try
                {
                    bkImage = new Bitmap(tempstr);
                    Frm.Size = new System.Drawing.Size(bkImage.Width + 6, bkImage.Height + 33);
                    //設置當前窗體的背景圖片為拖拽的照片
                    Frm.BackgroundImage = bkImage;
                }
                catch { }
            }
        }

 

然後在重載方法SetDragImageToFrm中註意此時傳遞的參數不同,此時傳遞的參數是TreeView控制項。

public void SetDragImageToFrm(TreeView TV, DragEventArgs e)
        {
            //標識變數表示拖拽模式為文件夾
            if (Var_Style == false)
            {
                e.Effect = DragDropEffects.Copy;
                String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);
                tempstr = str_Drop[0];//獲取拖放文件夾的目錄
                thdAddFile = new Thread(new ThreadStart(SetAddFile));   //創建一個線程
                thdAddFile.Start(); //執行當前線程
            }
        }

 

在上面的方法中獲取拖拽文件夾的目錄,然後創建一個線程並執行。

線程執行SetAddFile方法,在此方法中設置托管線程

public void SetAddFile()
        {
            this.Invoke(new AddFile(RunAddFile));//對指定的線程進行托管
        }

 

在方法RunAddFile設置線程

 

public void RunAddFile()
        { 
            TreeNode TNode = new TreeNode();//實例化一個線程
            Files_Copy(treeView1, tempstr, TNode, 0);
            Thread.Sleep(0);//持起主線程
            thdAddFile.Abort();//執行線程      
        }

 

在上面方法中執行FIles_Copy方法顯示文件夾下所有文件夾和文件的名稱。

#region  顯示文件夾下所有子文件夾及文件的名稱
        /// <summary>
        /// 顯示文件夾下所有子文件夾及文件的名稱
        /// </summary>
        /// <param Sdir="string">文件夾的目錄</param>
        /// <param TNode="TreeNode">節點</param>
        /// <param n="int">標識,判斷當前是文件夾,還是文件</param>
        private void Files_Copy(TreeView TV, string Sdir, TreeNode TNode, int n)
        {
            DirectoryInfo dir = new DirectoryInfo(Sdir);
            try
            {
                if (!dir.Exists)//判斷所指的文件或文件夾是否存在
                {
                    return;
                }
                DirectoryInfo dirD = dir as DirectoryInfo;//如果給定參數不是文件夾則退出
                if (dirD == null)//判斷文件夾是否為空
                {
                    return;
                }
                else
                {
                    if (n == 0)
                    {
                        TNode = TV.Nodes.Add(dirD.Name);//添加文件夾的名稱
                        TNode.Tag = 1;
                    }
                    else
                    {
                        TNode = TNode.Nodes.Add(dirD.Name);//添加文件夾裡面各文件夾的名稱
                        TNode.Tag = 1;
                    }
                }
                FileSystemInfo[] files = dirD.GetFileSystemInfos();//獲取文件夾中所有文件和文件夾
                //對單個FileSystemInfo進行判斷,如果是文件夾則進行遞歸操作
                foreach (FileSystemInfo FSys in files)
                {
                    FileInfo file = FSys as FileInfo;
                    if (file != null)//如果是文件的話,進行文件的複製操作
                    {
                        FileInfo SFInfo = new FileInfo(file.DirectoryName + "\\" + file.Name);//獲取文件所在的原始路徑
                        TNode.Nodes.Add(file.Name);//添加文件
                        TNode.Tag = 1;
                    }
                    else
                    {
                        string pp = FSys.Name;//獲取當前搜索到的文件夾名稱
                        Files_Copy(TV, Sdir + "\\" + FSys.ToString(), TNode, 1);//如果是文件夾,則進行遞歸調用
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }
        #endregion

 

完整示例代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;//添加的命名空間,對文件進行操作
using System.Threading;//線程式的命名空間

namespace 向窗體中拖放圖片並顯示
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static bool Var_Style = true;
        public static string tempstr="";
        private System.Threading.Thread thdAddFile; //創建一個線程
        private System.Threading.Thread thdOddDocument; //創建一個線程
        public static TreeNode TN_Docu = new TreeNode();//單個文件的節點
        private static TreeView Tem_TView;

        /// <summary>
        /// 在窗體背景中顯示被拖放的圖片
        /// </summary>
        /// <param Frm="Form">窗體</param>
        /// <param e="DragEventArgs">DragDrop、DragEnter 或 DragOver 事件提供數據</param>
        public void SetDragImageToFrm(Form Frm, DragEventArgs e)
        {
            //如果顯示照片的標識變數為true
            if (Var_Style == true)
            {
                //設置拖放操作中目標放置類型為複製
                e.Effect = DragDropEffects.Copy;
                String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);
                string tempstr;
                Bitmap bkImage;
                //獲取拖拽圖片的路徑
                tempstr = str_Drop[0];
                try
                {
                    bkImage = new Bitmap(tempstr);
                    Frm.Size = new System.Drawing.Size(bkImage.Width + 6, bkImage.Height + 33);
                    //設置當前窗體的背景圖片為拖拽的照片
                    Frm.BackgroundImage = bkImage;
                }
                catch { }
            }
        }

        /// <summary>
        /// 向TreeView控制項添加被拖放的文件夾目錄
        /// </summary>
        /// <param TV="TreeView">TreeView控制項</param>
        /// <param e="DragEventArgs">DragDrop、DragEnter 或 DragOver 事件提供數據</param>
        public void SetDragImageToFrm(TreeView TV, DragEventArgs e)
        {
            //標識變數表示拖拽模式為文件夾
            if (Var_Style == false)
            {
                e.Effect = DragDropEffects.Copy;
                String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);
                tempstr = str_Drop[0];//獲取拖放文件夾的目錄
                thdAddFile = new Thread(new ThreadStart(SetAddFile));   //創建一個線程
                thdAddFile.Start(); //執行當前線程
            }
        }


        public delegate void AddFile();//定義托管線程
        /// <summary>
        /// 設置托管線程
        /// </summary>
        public void SetAddFile()
        {
            this.Invoke(new AddFile(RunAddFile));//對指定的線程進行托管
        }

        /// <summary>
        /// 設置線程
        /// </summary>
        public void RunAddFile()
        { 
            TreeNode TNode = new TreeNode();//實例化一個線程
            Files_Copy(treeView1, tempstr, TNode, 0);
            Thread.Sleep(0);//持起主線程
            thdAddFile.Abort();//執行線程      
        }

        #region  返回上一級目錄
        /// <summary>
        /// 返回上一級目錄
        /// </summary>
        /// <param dir="string">目錄</param>
        /// <returns>返回String對象</returns>
        public string UpAndDown_Dir(string dir)
        {
            string Change_dir = "";
            Change_dir = Directory.GetParent(dir).FullName;
            return Change_dir;
        }
        #endregion

        #region  顯示文件夾下所有子文件夾及文件的名稱
        /// <summary>
        /// 顯示文件夾下所有子文件夾及文件的名稱
        /// </summary>
        /// <param Sdir="string">文件夾的目錄</param>
        /// <param TNode="TreeNode">節點</param>
        /// <param n="int">標識,判斷當前是文件夾,還是文件</param>
        private void Files_Copy(TreeView TV, string Sdir, TreeNode TNode, int n)
        {
            DirectoryInfo dir = new DirectoryInfo(Sdir);
            try
            {
                if (!dir.Exists)//判斷所指的文件或文件夾是否存在
                {
                    return;
                }
                DirectoryInfo dirD = dir as DirectoryInfo;//如果給定參數不是文件夾則退出
                if (dirD == null)//判斷文件夾是否為空
                {
                    return;
                }
                else
                {
                    if (n == 0)
                    {
                        TNode = TV.Nodes.Add(dirD.Name);//添加文件夾的名稱
                        TNode.Tag = 1;
                    }
                    else
                    {
                        TNode = TNode.Nodes.Add(dirD.Name);//添加文件夾裡面各文件夾的名稱
                        TNode.Tag = 1;
                    }
                }
                FileSystemInfo[] files = dirD.GetFileSystemInfos();//獲取文件夾中所有文件和文件夾
                //對單個FileSystemInfo進行判斷,如果是文件夾則進行遞歸操作
                foreach (FileSystemInfo FSys in files)
                {
                    FileInfo file = FSys as FileInfo;
                    if (file != null)//如果是文件的話,進行文件的複製操作
                    {
                        FileInfo SFInfo = new FileInfo(file.DirectoryName + "\\" + file.Name);//獲取文件所在的原始路徑
                        TNode.Nodes.Add(file.Name);//添加文件
                        TNode.Tag = 1;
                    }
                    else
                    {
                        string pp = FSys.Name;//獲取當前搜索到的文件夾名稱
                        Files_Copy(TV, Sdir + "\\" + FSys.ToString(), TNode, 1);//如果是文件夾,則進行遞歸調用
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }
        #endregion

        public void SetDragHandle(object sender, TreeView TV)
        {
            //獲取Tag標簽內容
            switch (Convert.ToInt16(((ToolStripMenuItem)sender).Tag.ToString()))
            {
                case 1:
                    {
                        //讓面板隱藏
                        panel_face.Visible = false;
                        //設置標識變數為true,true表示是拖拽圖片模式
                        Var_Style = true;
                        break;
                    }
                case 2:
                    {
                        this.Width = 399;
                        this.Height = 272;
                        panel_face.Visible = true;
                        Var_Style = false;
                        break;
                    }
            }
        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            //在窗體背景中顯示拖拽的照片
            SetDragImageToFrm(this, e);
            //清除treeView的所有節點
            treeView1.Nodes.Clear();
            //向TreeView控制項添加被拖拽的文件夾的目錄
            SetDragImageToFrm(treeView1, e);
        }

        private void Tool_Ima_Click(object sender, EventArgs e)
        {
            SetDragHandle(sender, treeView1);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Tem_TView = new TreeView();
            Tem_TView = treeView1;

        }
        string Tem_Dir = "";
        private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Node.Tag == null)
                Tem_Dir = "";
            else
                Tem_Dir = e.Node.Tag.ToString();
            if (Tem_Dir == "")
            {
                Tem_Dir = UpAndDown_Dir(tempstr) + "\\" + e.Node.FullPath;
                System.Diagnostics.Process.Start(@Tem_Dir);//打開當前文件
            }

        }
    }
}

代碼下載

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12027852


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過一個小組件,熟悉 Blazor 服務端組件開發。 "github" 一、環境搭建 vs2019 16.4, asp.net core 3.1 新建 Blazor 應用,選擇 asp.net core 3.1。 根文件夾下新增目錄 Components,放置代碼。 二、組件需求定義 Compone ...
  • 今天在學.net core的時候發現了一個問題,終結點死活映射不了自己添加的控制器,後經過研究發現解決方法,可能這個問題不應該叫做問題,可是我是初學者,就把這個問題給拎出來。本人開發環境 VS2019+.Net Core 3.1,問題重現過程: 1.新建Web Core項目,選擇空項目 2.新建文件 ...
  • static byte[] GetBytesFromDic(Dictionary<string,string> dic) { if(dic==null || !dic.Any()) { return null; } using (MemoryStream ms = new MemoryStream( ...
  • 場景 效果 點擊剪切按鈕 點擊粘貼按鈕 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 新建一個form窗體,設計佈局如下 主要是有兩個PictureBox控制項以及四個按鈕 ...
  • 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 ...
  • 項目中考慮到容災、性能以及容量,一般會使用集群方式搭建redis。而當redis主伺服器存在故障,為了redis仍能正常運行,可以搭建redis哨兵,通過選舉方式重新建立主從關係。本文簡單講述主從建立和哨兵的配置。本機測試redis為Redis-x64-3.2.100(Windows下載地址:htt ...
  • 場景 效果 將要批量複製的文件拖拽到窗體中,然後點擊下邊選擇目標文件夾,然後點擊複製按鈕。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 新建一個窗體,佈局設計如下 上面 ...
  • 場景 效果 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 新建form窗體,窗體中設計佈局如下,一個Panel中拖拽四個label,然後添加兩個Button,再添加一個T ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...