• WINCE中选择目录组件(C#)


      因为项目需要一个选择目录的功能,然.NET中在WINCE中folderBrowserDialog组件却不可用,在网上搜了2天都没找到此类可用资源,更搞的是有个资源说是通过导入Shell32.dll的API方式来调用,为引足足浪费半天时间也没找到WINCE平台上的Shell32.dll究竟在何处!不得已,只好自己写个,没想到2个多小时就搞定了,真搞不懂这么简单的资源网上也没有,难道是做嵌入式开的较少?看来自己的工作思路还是有点问题,碰到问题,首先想到google,这也是长年养成的依赖性。好了,废话不说了,简单讲讲思路如下:

      参考界面如下:

      整个组件分三部分:

      1、选择目录的主界面:

        需要一个TreeView组件,主要代码如下:

    FrmSelectFolder_Load
     1 private void FrmSelectFolder_Load(object sender, EventArgs e)
     2         {
     3             string errstr = "";
     4             try
     5             {
     6                 tvPathList.Nodes.Clear();
     7 
     8                 string currentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
     9                 string rootPath = Directory.GetDirectoryRoot(currentPath);
    10 
    11                 TreeNode rootNode = new TreeNode("我的设备");
    12                 tvPathList.Nodes.Add(rootNode);
    13 
    14                 //写个递归目录中全部文件夹检索出来
    15                 ScanFolder(rootNode, rootPath);
    16 
    17                 rootNode.Expand();
    18             }
    19             catch (System.Exception ex)
    20             {
    21                 errstr = "fail to FrmSelectFolder_Load【" + ex.Message + "";
    22                 MessageBox.Show(errstr);
    23             }
    24         }
    ScanFolder
     1 private void ScanFolder(TreeNode node, string path)
     2             {
     3                 string errstr = "";
     4                 try
     5                 {
     6                     string[] pathList = Directory.GetDirectories(path);
     7 
     8                     foreach (string p in pathList)
     9                     {
    10                         string strp = p.Replace(path, "");
    11 
    12                         if (strp.Substring(0, 1) == @"\")
    13                         {
    14                             strp = strp.Substring(1, strp.Length - 1);
    15                         }
    16                         TreeNode treeNode = new TreeNode(strp);
    17                         treeNode.ImageIndex = SelectImageIndex(strp, false);
    18                         node.Nodes.Add(treeNode);
    19 
    20                         ScanFolder(treeNode, p);
    21                     }
    22                 }
    23                 catch (System.Exception ex)
    24                 {
    25                     errstr = "fail to ScanFolder【" + ex.Message + "";
    26                     MessageBox.Show(errstr);
    27                 }
    28             }

      2、新建文件夹界面

         考虑到新建文件夹已存在的情况会自动加1.

    btnNew_Click
     1 private void btnNew_Click(object sender, EventArgs e)
     2         {
     3             string errstr = "";
     4             try
     5             {
     6                 TreeNode node = tvPathList.SelectedNode;
     7                 if (node == null)
     8                 {
     9                     MessageBox.Show("未选择目录");
    10                     return;
    11                 }
    12 
    13                 FrmNewFolder fnf = new FrmNewFolder();
    14                 fnf.Location = new Point((Screen.PrimaryScreen.Bounds.Width - fnf.Width) / 2, (Screen.PrimaryScreen.Bounds.Height - fnf.Height) / 2);
    15                 if (fnf.ShowDialog() == DialogResult.Cancel) { return; }
    16 
    17                 string folderName = fnf.m_folderName;
    18 
    19                 //计算当前目录的绝对路径
    20                 string currentPath = "";
    21                 TreeNode currentNode = node;
    22                 while (currentNode.Parent != null)
    23                 {
    24                     currentPath = currentNode.Text + @"\" + currentPath;
    25                     currentNode = currentNode.Parent;
    26                 }
    27 
    28                 string newCurrentPath =  @"\" + currentPath + folderName + @"\";
    29 
    30                 if (Directory.Exists(newCurrentPath))
    31                 {
    32                     if (folderName != "新建文件夹")
    33                     {
    34                         MessageBox.Show("文件夹【" + folderName + "】已存在!");
    35                         return;
    36                     }
    37                     else
    38                     {
    39                         //自动增加一个不存在的文件夹目录
    40                         int index = 1;
    41                         string newFolderName = String.Format("{0}{1}", folderName, index);
    42                         while (Directory.Exists(@"\" + currentPath + newFolderName + @"\"))
    43                         {
    44                             index++;
    45                             newFolderName = String.Format("{0}{1}", folderName, index);
    46                         }
    47                         folderName = newFolderName;
    48                         newCurrentPath = @"\" + currentPath + folderName + @"\"; 
    49                     }
    50                 }
    51 
    52                 DirectoryInfo di = Directory.CreateDirectory(newCurrentPath);
    53                 
    54                 TreeNode treeNode = new TreeNode(folderName);
    55                 treeNode.ImageIndex = SelectImageIndex(folderName, false);
    56                 node.Nodes.Insert(0, treeNode);
    57             }
    58             catch (System.Exception ex)
    59             {
    60                 errstr = "fail to btnNew_Click【" + ex.Message + "";
    61                 MessageBox.Show(errstr);
    62             }
    63         }

      3、调用此选择目录的主界面方法

    Execute
     1 public bool Execute(ref string errstr)
     2         {
     3             bool bRet = false;
     4             try
     5             {
     6                 FrmSelectFolder fsf = new FrmSelectFolder();
     7                 fsf.Location = new Point((Screen.PrimaryScreen.Bounds.Width - fsf.Width) / 2, (Screen.PrimaryScreen.Bounds.Height - fsf.Height) / 2);
     8                 if (fsf.ShowDialog() == DialogResult.OK)
     9                 {
    10                     FolderName = fsf.m_selectFoldeName;
    11                     bRet = true;
    12                 }
    13                 else
    14                 {
    15                     errstr = "取消选择";
    16                 }
    17                 return bRet;
    18             }
    19             catch (System.Exception ex)
    20             {
    21                 errstr = "fail to Execute【" + ex.Message + "";
    22                 return bRet;
    23             }
    24         }

    Execute
     1 public bool Execute(Control value, ref string errstr)
     2         {
     3             bool bRet = false;
     4             try
     5             {
     6                 FrmSelectFolder fsf = new FrmSelectFolder();
     7                 fsf.Location = new Point((value.Width - fsf.Width) / 2, (value.Height - fsf.Height) / 2);
     8                 if (fsf.ShowDialog() == DialogResult.OK)
     9                 {
    10                     FolderName = fsf.m_selectFoldeName;
    11                     bRet = true;
    12                 }
    13                 else
    14                 {
    15                     errstr = "取消选择";
    16                 }
    17                 return bRet;
    18             }
    19             catch (System.Exception ex)
    20             {
    21                 errstr = "fail to Execute【" + ex.Message + "";
    22                 return bRet;
    23             }
    24         }

     最后写个DEMO调用:

    View Code
    1 private void button3_Click(object sender, EventArgs e)
    2         {
    3             SelectFolder.SelectFolder sf = new SelectFolder.SelectFolder();
    4             if (sf.Execute(this))
    5             {
    6                 MessageBox.Show(sf.FolderName);
    7             }
    8         }

    效果如下:

    完整代码下载:

    http://download.csdn.net/detail/laststep/4528434

    注:类似Dialg的组件是怎么做的,没搞明白,因此组件对象化效果不好,不能在运行模式下隐藏,哪位知道怎么做的,交流下,谢谢!

      

  • 相关阅读:
    BZOJ2697 特技飞行 【贪心】
    BZOJ2795/2890/3647 [Poi2012]A Horrible Poem 【字符串hash】
    BZOJ2823 [AHOI2012]信号塔 【最小圆覆盖】
    BZOJ2924 [Poi1998]Flat broken lines 【Dilworth定理 + 树状数组】
    洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】
    POJ 2955
    江南大学第三届程序设计竞赛K题
    Codeforces 894C
    Codeforces 894B
    HDU 1789
  • 原文地址:https://www.cnblogs.com/jonathan236/p/2664962.html
Copyright © 2020-2023  润新知