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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...