日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DevExpress的TreeList实现显示本地文件目录并自定义右键实现删除与重命名文件

發布時間:2025/3/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DevExpress的TreeList实现显示本地文件目录并自定义右键实现删除与重命名文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景

使用DevExpress的TreeList顯示本磁盤下文件目錄并在樹節點上右鍵實現刪除與添加文件。

效果

?

自定義右鍵效果

?

?

實現

首先在包含Treelist的窗體的load方法中對treelist進行初始化

Common.DataTreeListHelper.RefreshTreeData(this.treeList1, 2);

其中this.treeList1就是當前窗體的treelist對象

然后第二個參數是默認展開級別。

public static void RefreshTreeData(DevExpress.XtraTreeList.TreeList treeList, int expandToLevel){string rootNodeId = Common.Global.AppConfig.TestDataDir;string rootNodeText =? ICSharpCode.Core.StringParser.Parse(ResourceService.GetString("Pad_DataTree_RootNodeText"));?? //"全部實驗數據";string fieldName = "NodeText";string keyFieldName = "Id";string parentFieldName = "ParentId";List<DataTreeNode> data = new List<DataTreeNode>();data = DataTreeListHelper.ParseDir(Common.Global.AppConfig.TestDataDir, data);data.Add(new DataTreeNode() { Id = rootNodeId, ParentId = String.Empty, NodeText = rootNodeText, NodeType = DataTreeNodeTypes.Folder });DataTreeListHelper.SetTreeListDataSource(treeList, data, fieldName, keyFieldName, parentFieldName);treeList.ExpandToLevel(expandToLevel);}

在上面方法中新建根節點,根節點的Id就是要顯示的目錄,在配置文件中讀取。
根節點的顯示文本就是顯示“全部實驗數據”,從配置文件中獲取。

然后調用工具類將目錄結構轉換成帶父子級關系的節點的list,然后再將根節點添加到list。

然后調用設置treeList數據源的方法。

在上面方法中存取節點信息的DataTreeNode

public class DataTreeNode{private string id;private string parentId;private string nodeText;private string createDate;private string fullPath;private string taskFile;private string barcode;private DataTreeNodeTypes nodeType = DataTreeNodeTypes.Folder;public string Id{get { return id; }set { id = value; }}public string ParentId{get { return parentId; }set { parentId = value; }}public string NodeText{get { return nodeText; }set { nodeText = value; }}public string CreateDate{get { return createDate; }set { createDate = value; }}public string FullPath{get { return fullPath; }set { fullPath = value; }}public string TaskFile{get { return taskFile; }set { taskFile = value; }}public string Barcode{get { return barcode; }set { barcode = value; }}public DataTreeNodeTypes NodeType{get { return nodeType; }set { nodeType = value; }}}

在上面方法中將目錄結構轉換為節點list的方法

?public static List<DataTreeNode> ParseDir(string dataRootDir, List<DataTreeNode> data){if (data == null){data = new List<DataTreeNode>();}if (!System.IO.Directory.Exists(dataRootDir)){return data;}DataTreeNode node = null;System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(dataRootDir);System.IO.DirectoryInfo[] subDirs = dir.GetDirectories();foreach(System.IO.DirectoryInfo subDir in subDirs){node = new DataTreeNode();node.Id = subDir.FullName;node.ParentId = dir.FullName;node.NodeText = subDir.Name;node.CreateDate = String.Format("{0:yyyy-MM-dd HH:mm:ss}", subDir.CreationTime);node.FullPath = subDir.FullName;node.TaskFile = String.Empty;?????????? //任務文件名node.NodeType = DataTreeNodeTypes.Folder;data.Add(node);ParseDir(subDir.FullName, data);}System.IO.FileInfo[] subFiles = dir.GetFiles();return data;}

通過遞歸將上面傳遞過來的目錄下的結構構造成節點的list并返回。

?

通過解析實驗目錄的方法返回list后再調用刷新treelist節點的方法

SetTreeListDataSource

public static void SetTreeListDataSource(DevExpress.XtraTreeList.TreeList treeList, List<DataTreeNode> data, string fieldName, string keyFieldName, string parentFieldName){#region 設置節點圖標System.Windows.Forms.ImageList imgList = new System.Windows.Forms.ImageList();imgList.Images.AddRange(imgs);treeList.SelectImageList = imgList;//目錄展開treeList.AfterExpand -= treeList_AfterExpand;treeList.AfterExpand += treeList_AfterExpand;//目錄折疊treeList.AfterCollapse -= treeList_AfterCollapse;treeList.AfterCollapse += treeList_AfterCollapse;//數據節點單擊,開啟整行選中treeList.MouseClick -= treeList_MouseClick;treeList.MouseClick += treeList_MouseClick;//數據節點雙擊選中treeList.MouseDoubleClick -= treeList_MouseDoubleClick;treeList.MouseDoubleClick += treeList_MouseDoubleClick;//焦點離開事件treeList.LostFocus -= treeList_LostFocus;treeList.LostFocus += treeList_LostFocus;#endregion#region 設置列頭、節點指示器面板、表格線樣式treeList.OptionsView.ShowColumns = false;???????????? //隱藏列標頭treeList.OptionsView.ShowIndicator = false;?????????? //隱藏節點指示器面板treeList.OptionsView.ShowHorzLines = false;?????????? //隱藏水平表格線treeList.OptionsView.ShowVertLines = false;?????????? //隱藏垂直表格線treeList.OptionsView.ShowIndentAsRowStyle = false;#endregion#region 初始禁用單元格選中,禁用整行選中treeList.OptionsView.ShowFocusedFrame = true;?????????????????????????????? //設置顯示焦點框treeList.OptionsSelection.EnableAppearanceFocusedCell = false;????????????? //禁用單元格選中treeList.OptionsSelection.EnableAppearanceFocusedRow = false;?????????????? //禁用正行選中//treeList.Appearance.FocusedRow.BackColor = System.Drawing.Color.Red;????? //設置焦點行背景色#endregion#region 設置TreeList的展開折疊按鈕樣式和樹線樣式treeList.OptionsView.ShowButtons = true;????????????????? //顯示展開折疊按鈕treeList.LookAndFeel.UseDefaultLookAndFeel = false;?????? //禁用默認外觀與感覺treeList.LookAndFeel.UseWindowsXPTheme = true;??????????? //使用WindowsXP主題treeList.TreeLineStyle = DevExpress.XtraTreeList.LineStyle.Percent50;???? //設置樹線的樣式#endregion#region 添加單列DevExpress.XtraTreeList.Columns.TreeListColumn colNode = new DevExpress.XtraTreeList.Columns.TreeListColumn();colNode.Name = String.Format("col{0}", fieldName);colNode.Caption = fieldName;colNode.FieldName = fieldName;colNode.VisibleIndex = 0;colNode.Visible = true;colNode.OptionsColumn.AllowEdit = false;??????????????????????? //是否允許編輯colNode.OptionsColumn.AllowMove = false;??????????????????????? //是否允許移動colNode.OptionsColumn.AllowMoveToCustomizationForm = false;???? //是否允許移動至自定義窗體colNode.OptionsColumn.AllowSort = false;??????????????????????? //是否允許排序colNode.OptionsColumn.FixedWidth = false;?????????????????????? //是否固定列寬colNode.OptionsColumn.ReadOnly = true;????????????????????????? //是否只讀colNode.OptionsColumn.ShowInCustomizationForm = true;?????????? //移除列后是否允許在自定義窗體中顯示treeList.Columns.Clear();treeList.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] { colNode });#endregion#region 綁定數據源treeList.DataSource = null;treeList.KeyFieldName = keyFieldName;treeList.ParentFieldName = parentFieldName;treeList.DataSource = data;treeList.RefreshDataSource();#endregion#region 初始化圖標SetNodeImageIndex(treeList.Nodes.FirstOrDefault());#endregion}

如果不考慮根據文件還是文件夾設置節點圖標和綁定其他雙擊事件等。

直接關注鼠標單擊事件的綁定和下面初始化樣式的設置。

在單擊鼠標節點綁定的方法中

private static void treeList_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e){DevExpress.XtraTreeList.TreeList treeList = sender as DevExpress.XtraTreeList.TreeList;if (treeList != null && treeList.Selection.Count == 1){object idValue = null;string strIdValue = String.Empty;DataTreeNode nodeData = null;List<DataTreeNode> datasource = treeList.DataSource as List<DataTreeNode>;if (datasource != null){idValue = treeList.Selection[0].GetValue("Id");strIdValue = idValue.ToString();nodeData = datasource.Where<DataTreeNode>(p => p.Id == strIdValue).FirstOrDefault<DataTreeNode>();if (nodeData != null){if (nodeData.NodeType == DataTreeNodeTypes.File){treeList.OptionsSelection.EnableAppearanceFocusedRow = true;??????????????????????????????? //啟用整行選中if (e.Button == System.Windows.Forms.MouseButtons.Right){System.Windows.Forms.ContextMenu ctxMenu = new System.Windows.Forms.ContextMenu();#region 右鍵彈出上下文菜單 - 刪除數據文件System.Windows.Forms.MenuItem mnuDelete = new System.Windows.Forms.MenuItem();mnuDelete.Text = "刪除";mnuDelete.Click += delegate(object s, EventArgs ea) {DialogResult dialogResult = DevExpress.XtraEditors.XtraMessageBox.Show(String.Format("確定要刪除此實驗數據嗎[{0}]?\r\n刪除后無法恢復!", nodeData.Id), "標題", System.Windows.Forms.MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (dialogResult == DialogResult.Yes){try{string fileName = String.Empty;#region 刪除數據文件fileName = String.Format("{0}{1}", nodeData.Id, Global.MAIN_EXT);if (System.IO.File.Exists(fileName)){System.IO.File.Delete(fileName);}#endregion#region 刪除對應的樹節點DevExpress.XtraTreeList.Nodes.TreeListNode selectedNode = treeList.FindNodeByKeyID(nodeData.Id);if (selectedNode != null){selectedNode.ParentNode.Nodes.Remove(selectedNode);}#endregiontreeList.OptionsSelection.EnableAppearanceFocusedRow = false;??????????????????????????????? //禁用整行選中}catch(Exception ex){ICSharpCode.Core.LoggingService<DataTreeListHelper>.Error("刪除實驗數據異常:" + ex.Message, ex);DevExpress.XtraEditors.XtraMessageBox.Show("刪除實驗數據異常:" + ex.Message, "標題", MessageBoxButtons.OK,MessageBoxIcon.Error);}}};ctxMenu.MenuItems.Add(mnuDelete);#endregion#region 右鍵彈出上下文菜單 - 重命名數據文件System.Windows.Forms.MenuItem mnuReName = new System.Windows.Forms.MenuItem();mnuReName.Text = "重命名";mnuReName.Click += delegate(object s, EventArgs ea){//獲取當前文件名string oldName = Path.GetFileNameWithoutExtension(strIdValue);Dialog.FrmReName frmReName = new FrmReName(oldName);frmReName.StartPosition = FormStartPosition.CenterScreen;DialogResult result = frmReName.ShowDialog();if (result == DialogResult.OK){//刷入框新設置的文件名string newName = frmReName.FileName;//獲取原來路徑string filePath = Path.GetDirectoryName(strIdValue);//使用原來路徑加 + 新文件名 結合成新文件路徑string newFilePath = Path.Combine(filePath, newName);DialogResult dialogResult = DevExpress.XtraEditors.XtraMessageBox.Show(String.Format("確定要將實驗數據[{0}]重命名為[{1}]嗎?", nodeData.Id, newName), "標題", System.Windows.Forms.MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (dialogResult == DialogResult.Yes){try{string fileName = String.Empty;string newFileName = String.Empty;#region 重命名主通道數據文件fileName = String.Format("{0}{1}", nodeData.Id, Global.MAIN_EXT);newFileName = String.Format("{0}{1}", newFilePath, Global.MAIN_EXT);if (System.IO.File.Exists(fileName)){FileInfo fi = new FileInfo(fileName);fi.MoveTo(newFileName);}#endregion//刷新樹Common.DataTreeListHelper.TriggerRefreshDataEvent();XtraMessageBox.Show("重命名成功");treeList.OptionsSelection.EnableAppearanceFocusedRow = false;??????????????????????????????? //禁用整行選中}catch (Exception ex){ICSharpCode.Core.LoggingService<DataTreeListHelper>.Error("刪除實驗數據異常:" + ex.Message, ex);DevExpress.XtraEditors.XtraMessageBox.Show("刪除實驗數據異常:" + ex.Message, "標題", MessageBoxButtons.OK,MessageBoxIcon.Error);}}}};ctxMenu.MenuItems.Add(mnuReName);#endregion#endregionctxMenu.Show(treeList, new System.Drawing.Point(e.X, e.Y));}return;}}}treeList.OptionsSelection.EnableAppearanceFocusedRow = false;??????????????????????????????? //禁用整行選中}}

其中在進行重命名時需要彈出一個窗體

具體實現參照:

Winform巧用窗體設計完成彈窗數值綁定-以重命名彈窗為例:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103155532

總結

以上是生活随笔為你收集整理的DevExpress的TreeList实现显示本地文件目录并自定义右键实现删除与重命名文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。