Csharp: TreeList Drag and Drop

来源:https://www.cnblogs.com/geovindu/archive/2019/07/05/11139142.html
-Advertisement-
Play Games

/// /// https://www.codeproject.com/articles/3225/treelistview /// https://www.codeproject.com/Tips/572728/TreeListViewEx-Tree-List-and-Drag-and-Drop ... ...


  /// <summary>
    /// https://www.codeproject.com/articles/3225/treelistview
    /// https://www.codeproject.com/Tips/572728/TreeListViewEx-Tree-List-and-Drag-and-Drop     
    /// https://sourceforge.net/projects/objectlistview/
    /// 塗聚文 20190704
    /// Geovin Du
    /// </summary>
    public partial class TryTreeListView : Form
    {
        List<int> selectindex = new List<int>();//
  
        TreeListViewItem draggedNode=new TreeListViewItem();
        /// <summary>
        /// 
        /// </summary>
        public string draggtext
        {
            set;
            get;
        }
        /// <summary>
        /// 
        /// </summary>
        string beforeEdit = "";
        /// <summary>
        /// 
        /// </summary>
        string beforeEditName = "";
        /// <summary>
        /// 
        /// </summary>
        string afterEdit = "";
        string nodechildid = "";
        string nodeparentid = "";
        string nodechild = "";
        string nodeparent = "";
        string nodetitle = "";
        /// <summary>
        /// 
        /// </summary>
        List<TreeListViewItem> getList = new List<TreeListViewItem>();
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
       DataTable setList()
       {

            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("ParentId", typeof(int));
            dt.Columns.Add("Level", typeof(int));
            dt.Rows.Add(1, "六福集團", 0,0);
            dt.Rows.Add(2, "廣州六福", 1,1);
            dt.Rows.Add(3, "北京六福", 1,1);
            dt.Rows.Add(4, "上海六福", 1,1);
            dt.Rows.Add(5, "深圳六福", 1,1);
            dt.Rows.Add(6, "人事部", 5,2);
            dt.Rows.Add(7, "科技部", 5,2);
            dt.Rows.Add(8, "恆大集團", 0, 0);
            dt.Rows.Add(9, "恆大廣州", 8, 1);
            dt.Rows.Add(10, "恆大北京", 8, 1);
            dt.Rows.Add(11, "恆大上海", 8, 1);
            dt.Rows.Add(12, "恆大深圳", 8, 1);
            dt.Rows.Add(13, "人事部", 11, 2);
            dt.Rows.Add(14, "科技部", 11, 2);


            return dt;
       }
       /// <summary>
       /// 
       /// </summary>
       /// <param name="tr1"></param>
       /// <param name="parentId"></param>
       private void setTreeView(TreeView tr1, int parentId)
       {

           DataRow[] ds = setList().Select("ParentId=" + parentId.ToString());
           if (ds.Length > 0)
           {
               int pId = -1;
               foreach (DataRow row in ds)
               {
                   TreeNode node = new TreeNode();
                   node.Text = row["Name"].ToString();
                   node.Tag = (int)row["Id"];
                   pId = (int)row["ParentId"];
                   if (pId == 0)
                   {
                       //添加根節點
                       tr1.Nodes.Add(node);
                   }
                   else
                   {
                       //添加根節點之外的其他節點
                       RefreshChildNode(tr1, node, pId);
                   }
                   //查找以node為父節點的子節點
                   setTreeView(tr1, (int)node.Tag);

               }
           }
                  
       }
        /// <summary>
        /// 
        /// </summary>
        public void bind()
       {

           ColumnHeader head=new ColumnHeader();
           head.Text = "Level";        
           treeListView1.Columns.Add(head);
           DataRow[] ds = setList().Select("ParentId=0");
           
           

           foreach (DataRow row in ds)
           {

               //第一層
               TreeListViewItem itemA = new TreeListViewItem(row["Name"].ToString(), 0);
               itemA.Expand();
               itemA.SubItems.Add(row["Id"].ToString());
               itemA.SubItems.Add(row["ParentId"].ToString());
               itemA.SubItems.Add(row["Level"].ToString());
               itemA.ToolTipText = row["ParentId"].ToString();
               treeListView1.Items.Add(itemA);
               DataRow[] ds1 = setList().Select("ParentId=" + row["Id"].ToString());
               if (ds1.Length > 0)
               {
                   //第二層
                   foreach (DataRow row1 in ds1)
                   {
                       if (row["Id"].ToString() == row1["ParentId"].ToString())
                       {
                           TreeListViewItem item = new TreeListViewItem(row1["Name"].ToString(), 1);
                           item.SubItems.Add(row1["Id"].ToString());
                           item.SubItems.Add(row1["ParentId"].ToString());
                           item.SubItems.Add(row1["Level"].ToString());
                           item.ToolTipText = row1["ParentId"].ToString();
                           itemA.Items.Add(item);

                           DataRow[] ds2 = setList().Select("ParentId=" + row1["Id"].ToString());
                           if (ds2.Length > 0)
                           {
                               foreach (DataRow row2 in ds2)
                               {
                                   //第三層
                                   if (row1["Id"].ToString() == row2["ParentId"].ToString())
                                   {
                                       TreeListViewItem item2 = new TreeListViewItem(row2["Name"].ToString(), 2);
                                       item2.SubItems.Add(row2["Id"].ToString());
                                       item2.SubItems.Add(row2["ParentId"].ToString());
                                       item2.SubItems.Add(row2["Level"].ToString());
                                       item2.ToolTipText = row2["ParentId"].ToString();
                                       item.Items.Add(item2);
                                   }


                               }
                           }
                       }    
                   }
               }



           }

       }
       /// <summary>
       /// 處理根節點的子節點
       /// </summary>
       /// <param name="tr1"></param>
       /// <param name="treeNode"></param>
       /// <param name="parentId"></param>
       private void RefreshChildNode(TreeView tr1, TreeNode treeNode, int parentId)
       {
           foreach (TreeNode node in tr1.Nodes)
           {
               if ((int)node.Tag == parentId)
               {
                   node.Nodes.Add(treeNode);
                   return;
               }
               else if (node.Nodes.Count > 0)
               {
                   FindChildNode(node, treeNode, parentId);
               }
           }
       }
       /// <summary>
       /// 處理根節點的子節點的子節點
       /// </summary>
       /// <param name="tNode"></param>
       /// <param name="treeNode"></param>
       /// <param name="parentId"></param>
       private void FindChildNode(TreeNode tNode, TreeNode treeNode, int parentId)
       {

           foreach (TreeNode node in tNode.Nodes)
           {
               if ((int)node.Tag == parentId)
               {
                   node.Nodes.Add(treeNode);
                   return;
               }
               else if (node.Nodes.Count > 0)
               {
                   FindChildNode(node, treeNode, parentId);

               }

           }

       }


        /// <summary>
        /// 
        /// </summary>
        public TryTreeListView()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TryTreeListView_Load(object sender, EventArgs e)
        {
            setTreeView(this.treeView1, 0);
            this.treeView1.ExpandAll();
            bind();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_ItemCheck(object sender, ItemCheckEventArgs e)
        {

            TreeListViewItem item = new TreeListViewItem();
            //MessageBox.Show(e.Index.ToString());
            // TreeListViewItem
            //MessageBox.Show(treeListView1.SelectedItems.Count.ToString());
            // MessageBox.Show(treeListView1.Items[0].SubItems[0].Text);
            //MessageBox.Show(treeListView1.GetTreeListViewItemFromIndex(e.Index).Text);
            if (treeListView1.GetTreeListViewItemFromIndex(e.Index).Checked == false)
            {

                //MessageBox.Show(treeListView1.GetTreeListViewItemFromIndex(e.Index).SubItems[0].Text);  //從子節點開始
                item = treeListView1.GetTreeListViewItemFromIndex(e.Index);
                getList.Add(item);
            }

            //取消
            //if (treeListView1.GetTreeListViewItemFromIndex(e.Index).Checked == true)
            //{
            //    MessageBox.Show(treeListView1.GetTreeListViewItemFromIndex(e.Index).SubItems[0].Text);
            //}

            //MessageBox.Show(e.Index.ToString());
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_ItemActivate(object sender, EventArgs e)
        {
            
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            this.textBox1.Text=getList.Count.ToString();
            string s = getList[0].FullPath; //節點路徑
            string l=getList[0].Level.ToString();
            string ss = getList[0].Parent.Text;
            string sb = getList[0].Parent.SubItems[0].Text;
            Form1 frm = new Form1();
            frm.fullpath = getList[0].FullPath; //節點路徑
            frm.editname = getList[0].Text;
            frm.id = getList[0].SubItems[1].Text;
            if (frm.ShowDialog() == DialogResult.OK)
            {

            }
             getList = new List<TreeListViewItem>();

          

            
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_ItemMouseHover(object sender, ListViewItemMouseHoverEventArgs e)
        {
            //MessageBox.Show(e.Item.Text);
        }
        /// <summary>
        /// 編輯前的值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_BeforeLabelEdit(object sender, TreeListViewBeforeLabelEditEventArgs e)
        {
            MessageBox.Show(e.Item.Text);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_AfterLabelEdit(object sender, TreeListViewLabelEditEventArgs e)
        {
            MessageBox.Show(e.Item.Text);
        }
        /// <summary>
        /// 拖放完成發生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_DragDrop(object sender, DragEventArgs e)
        {
            try
            {

                // Retrieve the client coordinates of the drop location.
                Point targetPoint = treeListView1.PointToClient(new Point(e.X, e.Y));
                //所要放置的位置
                // Retrieve the node at the drop location.
                TreeListViewItem targetNode = treeListView1.GetItemAt(targetPoint);
                TreeListViewItem fullNode = treeListView1.GetItemAtFullRow(targetPoint);
                // draggedNode = (TreeListViewItem)e.Data.GetData(typeof(TreeListViewItem));
                //string s = e.Data.GetData(typeof(TreeListViewItem)).ToString();
                System.Windows.Forms.TreeListView.DragItemData data = (System.Windows.Forms.TreeListView.DragItemData)e.Data.GetData(typeof(System.Windows.Forms.TreeListView.DragItemData));
                draggedNode = (TreeListViewItem)data.DragItems[0];

                if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode))
                {
                    // If it is a move operation, remove the node from its current 
                    // location and add it to the node at the drop location.
                    if (e.Effect == DragDropEffects.Move)
                    {


                        //draggedNode.Remove();
                        // int indx=targetNode.Index;
                        // targetNode.Items.Insert(draggedNode.Index,draggedNode);
                        //treeListView1.Items.Insert(indx, targetNode);

                        draggedNode.Remove();
                        targetNode.Items.Add(draggedNode);

                        // targetNode.Items.Insert(indx, draggedNode); //父節點,添加移動的子節點

                        nodechildid = draggedNode.SubItems[1].Text;//子節點
                        nodeparentid = targetNode.SubItems[1].Text;//父節點
                        nodechild = draggedNode.Text;//子節點
                        nodeparent = targetNode.Text;//父節點
                        nodetitle = draggedNode.ToolTipText;

                        //bookKindListInfo.BookKindID = int.Parse(nodechildid);
                        //bookKindListInfo.BookKindParent = int.Parse(nodeparentid);
                        //bookKindListInfo.BookKindName = nodechild;
                        //bookKindListInfo.BookKindCode = nodetitle;
                        //this.textBox1.Text = nodeparent;
                        //this.textBox2.Text = nodechild;
                        //this.textBox3.Text = nodetitle;
                        //formOperatingStringInfo.NodeMoveUpdated = true;

                        //button1.Text = "移動區域節點";

                        //administrativeAreaListInfo.AreaID = int.Parse(nodechildid);                  
                        //administrativeAreaListInfo.AreaParentID = int.Parse(nodeparentid);
                        //administrativeAreaListInfo.AreaName = nodechild;
                        //int k = bookKindListBLL.UpdateBookKindList(bookKindListInfo);
                        //if (k >= 1)
                        //{
                        //    MessageBox.Show("移動書目錄成功!");
                        //    InitDataTable();
                        //    BindRoot();
                        //    treeView1.ExpandAll(); //全部展開
                        //}
                        //else
                        //{
                        //    MessageBox.Show("移動書目錄不成功!");
                        //}


                        /// MessageBox.Show("子節點:" + nodechild + ",父節點:" + nodeparent, "拖動節點", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                    // If it is a copy operation, clone the dragged node 
                    // and add it to the node at the drop location.
                    else if (e.Effect == DragDropEffects.Copy)
                    {
                        targetNode.Items.Add((TreeListViewItem)draggedNode.Clone());
                    }

                    // Expand the node at the location 
                    // to show the dropped node.
                    targetNode.Expand();
                }
            }
            catch (Exception ex)
            {
                ex.Message.ToString();
            }
        }

        /// <summary>
        ///Determine whether one node is a parent 
        ///or ancestor of a second node.
        /// </summary>
        /// <param name="node1"></param>
        /// <param name="node2"></param>
        /// <returns></returns>
        private bool ContainsNode(TreeListViewItem node1, TreeListViewItem node2)
        {
            // Check the parent node of the second node.
            if (node2.Parent == null) return false;
            if (node2.Parent.Equals(node1)) return true;

            // If the parent node is not null or equal to the first node, 
            // call the ContainsNode method recursively using the parent of 
            // the second node.
            return ContainsNode(node1, node2.Parent);
        }

        /// <summary>
        /// 施放離開邊界時發生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_DragLeave(object sender, EventArgs e)
        {
            
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = e.AllowedEffect;
            
            
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            // Move the dragged node when the left mouse button is used.
            if (e.Button == MouseButtons.Left)
            {
                DoDragDrop(e.Item, DragDropEffects.Move);
                draggedNode = (TreeListViewItem)e.Item;

            }

            // Copy the dragged node when the right mouse button is used.
            else if (e.Button == MouseButtons.Right)
            {
                DoDragDrop(e.Item, DragDropEffects.Copy);
                draggedNode = (TreeListViewItem)e.Item;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_DragOver(object sender, DragEventArgs e)
        {
            //draggedNode = (TreeListViewItem)e.Data.GetData(typeof(TreeListViewItem));

                //Point draggedPoint = treeListView1.PointToClient(new Point(e.X, e.Y));
                //draggedNode = treeListView1.GetItemAt(draggedPoint);         


        }
        /// <summary>
        /// 雙控制項
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_DoubleClick(object sender, EventArgs e)
        {
           string selectedname=treeListView1.SelectedItems[0].Text;
           Form1 frm = new Form1();
           frm.fullpath = treeListView1.SelectedItems[0].FullPath; //節點路徑
           frm.editname = treeListView1.SelectedItems[0].Text;
           frm.id = treeListView1.SelectedItems[0].SubItems[1].Text;
           if (frm.ShowDialog() == DialogResult.OK)
           {

           }
           this.textBox1.Text = selectedname;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeListView1_Leave(object sender, EventArgs e)
        {
            if (treeListView1.SelectedItems!= null)
            {
                //讓選中項背景色呈現紅色
                treeListView1.SelectedItems[0].BackColor = Color.Red;
                //前景色為白色
                treeListView1.SelectedItems[0].ForeColor = Color.White;
            }
        }
        /// <summary>
        /// 添加子節點
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void addToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 編輯當前節點
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void editToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 刪除當前節點
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void delToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 添加同層節點
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void addLevelToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }


    }

  


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

-Advertisement-
Play Games
更多相關文章
  • 基於Python+Unittest+Ddt+Senium+HTMLReport 框架結構: ...
  • [TOC] 題目 "戳" 思路 $bfs$ 第一遍提交$50$,第二遍就$100$了,qwq $Code$ cpp include include include include include using namespace std; int t,ca,cb,n,step,sum; int a_n ...
  • 在處理faster-rcnn和yolo時筆者使用labelimg標註圖片 但是我們只截取了大概800張左右的圖,這個量級在訓練時肯定是不夠的,所以我們需要使用數據增強(無非是旋轉加噪調量度)來增加我們的訓練樣本 這裡附上 視頻按幀率截取圖片的腳本代碼 https://www.cnblogs.com/ ...
  • 描述:將一個視頻流按幀數截取大量的圖片 用途:AI的數據集製作,得到大量的圖片,之後將其打標簽 更改的地方 1.default--間隔的幀數 2.input/output--輸入視頻的路徑、存放截取圖片的路徑 (將路徑放入後面的‘ ’中即可)前面加r可表示絕對路徑 eg: 直接上代碼 參考 http ...
  • # <center>Consul+Ocelot的服務網關與註冊等功能的實現</center> 此文檔主要提供給開發人員使用, 暫時僅實現服務註冊、服務發現、負載均衡等功能, 更多功能需配合官方文檔或第三方文檔進行更細緻化開發。 ###`有興趣可以瞭解一下` * #### Consul相關: * [C ...
  • 1) 整形類型: int 只能存整數; 2)小數類型: double 既可以存整數,也可以存小數,小數點後15-16位; 3)金錢類型: decimal 用來存金錢類型 ,值後面加一個m,小數點後28-29位; 4)字元串類型 :string,可以存多個文本,也可以存空,用雙引號 包起來; 5)字元 ...
  • 題目描述 用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。 解題思路 棧:先進後出,隊列:先進先出。用兩個【先進後出】的實現一個【先進先出】。對於兩個棧而言,插入的時候沒有什麼問題,直接插入就可以,出棧的時候,需要藉助另外一個棧操作。簡單的來說就是負負為正。這裡有 ...
  • .Net知識大全 本章內容適用於對.NET有一定基礎的或者是想通過本文章對.NET基礎知識記不清楚的朋友,可以通過本文章進行回顧。 面試的時候可能也會遇到相應的題目,建議面試前進行回顧!!! 1.NET和C#是什麼關係? C#就是為宣傳.NET而創立的,它直接集成於Visual Studio .NE ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...