• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
bobird的学习笔记
博客园    首页    新随笔    联系   管理    订阅  订阅
AddData(添加数据)对话框的实现与扩展(C#)

先看两张图,第一张是AE自带的Add data对话框, 相信所有做AE开发的人都见过;另一张是本人仿制和扩展的添加数据对话框,大家肯定没见过。

各位筒子,有没有觉得十分震撼?这是我整整一天的劳动结晶,下面就让我来隆重介绍一下。 我的风格是有所保留的奉献源码,无所顾忌的贡献思路。 为什么做这个东西 一个原因是本人可能是极端分子,在做软件时,要么全部用中文,要么全部用英文,最不喜欢半洋半中,因此一直有个宏伟的计划,就是将AE里面自带的对话框和浮动窗体都重做一下,这个工作仍然在进行中;另一个原因是AE自带的这个对话框只能加载其指定的数据类型,连Desktop中支持的CAD图都不能加载,就别说自定义的数据类型了,以前的做法重新写一个命令来加载这些数据,这让我很反感,所以一直想自己设计一个添加数据的对话框。 这个东西是怎么做的 网上有通过Windows API函数直接扩展Windows对话框如打开文件对话框的例子,但十分复杂,而且也不一定能做出我想要的效果。其实自己动手做一个普通对话框不难,但做一个打开文件的对话框难在何处呢?我们先看看AE自带的Adddata对话框的结构:顶部是一个下拉列表框,可以以树状的形式显示驱动器和文件夹;左边是几个按钮,起过滤文件类型的作用;正中是一个列表框,可以显示驱动器、文件夹、文件的信息;底部有一个文本框用于显示文件名,一个下拉列表框,用于选择文件类型,还有两个按钮,一个是打开按钮,一个是取消按钮。好了,通过分析这个对话框的结构,我们就可以发现实现的难点在何处了。 难点一:如何实现一个树状的下拉列表框; 难点二:如何获取计算机中的驱动器、文件夹和文件信息; 难点三:如何分门别类的加载各种数据。 实际上,后面两个都是比较容易解决的,关键就是第一个了,于是我又想到第三方控件以及我的最爱开源网站www.codeproject.com了,往上一搜,果然有人写过,让我喜出望外的是,作者的目的也是为了仿制一个Window打开文件对话框,这就好办了。 这款第三方控件名为ExplorerControls,提供了好几个做界面的控件,大家可以去看看,网址是:http://www.codeproject.com/KB/cpp/ExpCombo.aspx 接下来开始动手,首先是设计界面,费了不少功夫,做一个漂亮的界面真不是件容易的事,甚至比写程序还累。这个界面的主角当然是ExplorerControls中的Brower控件了,这个控件由一个下拉列表和一个列表框组成,基本实现了打开文件框中相应的部分,即在下拉列表中选择驱动器和文件夹,在列表框中显示文件夹和文件。browser需要设置许多属性,大家可参照源码来做。 下面就要写代码了。 一、点击左边按钮过滤文件类型的功能的实现 很简单,brower有一个Filter属性,可以设置你想要的所有文件类型,注意这是一个string数组。下面是一个过滤raster的按钮的单击事件。

[csharp] view plaincopyprint?
  1. privatevoid btnFilterRaster_Click(object sender, EventArgs e) 
  2. { 
  3. this.browser.Filter = newstring[] { "img","tif","tiff","jpg","jpeg","bmp","gif","png"}; 
  4. this.browser.RefreshBrowser(); 
  5. this.cmbDataType.Items.Clear(); 
  6. this.cmbDataType.Items.AddRange( newstring[] { 
  7. "所有支持的文件 (*.img,*.tif,*.tiff,*.jpg,*.jpeg,*.bmp,*.gif,*.png)", 
  8. "Imagine image文件 (*.img)", 
  9. "TIFF文件 (*.tif)", 
  10. "TIFF文件 (*.tiff)", 
  11. "JPEG文件 (*.jpg)", 
  12. "JPEG文件 (*.jpeg)", 
  13. "位图文件 (*.bmp)", 
  14. "PNG文件 (*.png)", 
  15. "GIF文件 (*.gif)" 
  16. }); 
  17. this.cmbDataType.SelectedIndex = 0; 
  18. g_pDataType = 3; 
  19. } 
private void btnFilterRaster_Click(object sender, EventArgs e)
{
this.browser.Filter = new string[] { "img","tif","tiff","jpg","jpeg","bmp","gif","png"};
this.browser.RefreshBrowser();
this.cmbDataType.Items.Clear();
this.cmbDataType.Items.AddRange( new string[] {
"所有支持的文件 (*.img,*.tif,*.tiff,*.jpg,*.jpeg,*.bmp,*.gif,*.png)",
"Imagine image文件 (*.img)",
"TIFF文件 (*.tif)",
"TIFF文件 (*.tiff)",
"JPEG文件 (*.jpg)",
"JPEG文件 (*.jpeg)",
"位图文件 (*.bmp)",
"PNG文件 (*.png)",
"GIF文件 (*.gif)"
});
this.cmbDataType.SelectedIndex = 0;
g_pDataType = 3;
}

其中,cmbDataType是文件类型的下拉列表框,g_pDataType是标志,用于判断打开的是什么类型的数据。
二、在列表框中单击文件返回文件路径,单击文件夹打开文件夹 brower公开了一个SelectedListIndexChanged事件,可以在个事件中添加相应代码,如下所示:

[csharp] view plaincopyprint?
  1. privatevoid browser_SelectedListIndexChanged(object sender,EventArgs e) 
  2. { 
  3.     string SelectFileName=""; 
  4.     m_ShitemList = new List<CShItem>(); 
  5.     ExplorerControls.ExpList.SelectedExpListItemCollection ExpListCol = this.browser.SelectedListItems; 
  6.     if (ExpListCol.Count == 0) return; 
  7.     elseif (ExpListCol.Count == 1) 
  8.     { 
  9.         ExpListItem pExpListItem = ExpListCol[0]; 
  10.         CShItem shItem; 
  11.         shItem = pExpListItem.CShItem; 
  12.         if (shItem.IsFolder) 
  13.         { 
  14.             m_shItem_1 = shItem; 
  15.             this.txtFileName.Text = ""; 
  16.             return; 
  17.         } 
  18.         else 
  19.         { 
  20.             m_ShitemList.Add(shItem); 
  21.             m_shItem_1 = null; 
  22.         } 
  23.        
  24.         SelectFileName = pExpListItem.Text; 
  25.         this.txtFileName.Text = SelectFileName; 
  26.     } 
  27.     else 
  28.     { 
  29.         foreach (ExpListItem pExpListItem in ExpListCol) 
  30.         { 
  31.             CShItem shItem; 
  32.             shItem = pExpListItem.CShItem; 
  33.             if (shItem.IsFolder) 
  34.             { 
  35.                 m_shItem_1 = shItem; 
  36.                 this.txtFileName.Text = ""; 
  37.                 return; 
  38.             } 
  39.             else 
  40.             { 
  41.                 m_ShitemList.Add(shItem); 
  42.                 m_shItem_1 = null; 
  43.             } 
  44.             SelectFileName += pExpListItem.Text; 
  45.             SelectFileName += "; "; 
  46.         } 
  47.         SelectFileName = SelectFileName.Remove(SelectFileName.Length - 1); 
  48.         this.txtFileName.Text = SelectFileName; 
  49.     } 
  50. } 
        private void browser_SelectedListIndexChanged(object sender,EventArgs e)
        {
            string SelectFileName="";
            m_ShitemList = new List<CShItem>();
            ExplorerControls.ExpList.SelectedExpListItemCollection ExpListCol = this.browser.SelectedListItems;
            if (ExpListCol.Count == 0) return;
            else if (ExpListCol.Count == 1)
            {
                ExpListItem pExpListItem = ExpListCol[0];
                CShItem shItem;
                shItem = pExpListItem.CShItem;
                if (shItem.IsFolder)
                {
                    m_shItem_1 = shItem;
                    this.txtFileName.Text = "";
                    return;
                }
                else
                {
                    m_ShitemList.Add(shItem);
                    m_shItem_1 = null;
                }
              
                SelectFileName = pExpListItem.Text;
                this.txtFileName.Text = SelectFileName;
            }
            else
            {
                foreach (ExpListItem pExpListItem in ExpListCol)
                {
                    CShItem shItem;
                    shItem = pExpListItem.CShItem;
                    if (shItem.IsFolder)
                    {
                        m_shItem_1 = shItem;
                        this.txtFileName.Text = "";
                        return;
                    }
                    else
                    {
                        m_ShitemList.Add(shItem);
                        m_shItem_1 = null;
                    }
                    SelectFileName += pExpListItem.Text;
                    SelectFileName += "; ";
                }
                SelectFileName = SelectFileName.Remove(SelectFileName.Length - 1);
                this.txtFileName.Text = SelectFileName;
            }
        }

其中CShitem是一个十分重要的类,在这个类中提供了诸如文件路径path的属性,也提供了诸如判断所选项是文件夹还是文件的方法isforder,这些东西十分有用。由于brower支持多选,所以定义了一个list数组m_ShitemList来存储列表框中被选定的所有项。txtFileName是一个用于显示文件名的文本框。 三、将文件的双击事件绑定到打开按钮 看如下代码:         private void browser_FileActivate(object sender, ExpList.ExpListItemEventArgs e)         {             this.btnOpen.PerformClick();         } 四、在打开按钮中实现打开各种数据的代码 加载各种数据的代码在论坛中很多,这里不再重复。 这样,工作就完成了,当然中间有很多细节我无法一一表述,大家不妨也动动手,DIY一个自己的添加数据对话框。

posted on 2013-07-03 16:05  bobird  阅读(3119)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3