您的位置:首页 > 编程语言 > C#

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

2013-05-17 16:46 190 查看
先看两张图,第一张是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一个自己的添加数据对话框。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐