现在的位置: 首页 > 综合 > 正文

AddData(添加数据)对话框的实现与扩展(C#)

2013年05月18日 ⁄ 综合 ⁄ 共 3167字 ⁄ 字号 评论关闭

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

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

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事件,可以在个事件中添加相应代码,如下所示:

        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一个自己的添加数据对话框。

抱歉!评论已关闭.