WinForm控件分享之文件信息显示控件【c#源码】

在之前的文章 Networkcomms v3 压力测试程序之微FTP服务器 中,在程序主界面中,用到了显示文件信息的控件,如下图(中间的部分):

当客户端用户点击左侧的TreeNode节点时,客户端发送节点想对应的参数值给服务端,并从服务器端获取相应的文件列表,客户端根据获取到的文件列表显示文件。

        private void Reload(string destDir)
        {            //上图中,中间部分放了一个FlowLayoutPanel控件,用于加载文件显示控件
            flowLayoutPanel1.Controls.Clear();

            //发送左侧目录节点相对应的值给服务器端
            ReqDocDirectoryContract body = new ReqDocDirectoryContract(destDir);
            //从服务器中获取左侧目录节点相对应的文件
            DocDirectory docDir = AppOutter.TcpConn.SendReceiveObject<ReqDocDirectoryContract, DocDirectory>("GetRcDocDirectory", "ResRcDocDirectory", 5000, body);

            int i=0;
            //给当前文件列表变量赋值
            CurrentFileList = docDir.FileList;

            foreach (FileDetail fileDetail in docDir.FileList)
            {                 //声明一个文件显示控件
                ImageItemButton itemButton = new ImageItemButton();

                string extension = Path.GetExtension(fileDetail.Name);

                //根据文件的后缀名,显示不同的图标
                itemButton.ButtonImage = GetIcoByExtension(extension.ToLower());

                itemButton.ButtonText = fileDetail.Name;
                itemButton.Name = "ItemButton" + i;
                //把文件信息赋值给显示控件
                itemButton.FileInfo = fileDetail;

                itemButton.NewClick += new EventHandler<EventArgs>(itemButton_NewClick);
                itemButton.NewMouseLeave += new EventHandler<EventArgs>(itemButton_NewMouseLeave);
                itemButton.NewMouseHover += new EventHandler<EventArgs>(itemButton_NewMouseHover);

                //文件下载事件
                itemButton.NewDownFile += new EventHandler<FileEventArgs>(itemButton_NewDownFile);
                itemButton.NewOpenFile += new EventHandler<FileEventArgs>(itemButton_NewOpenFile);
                itemButton.NewDoubleClick += new EventHandler<FileEventArgs>(itemButton_NewDoubleClick);
                itemButton.NewRemoveFile += new EventHandler<FileEventArgs>(itemButton_NewRemoveFile);

                this.flowLayoutPanel1.Controls.Add(itemButton);

                i++;
            }
            //如果没有从服务器获取到文件列表,就显示一个Label

            if (docDir.FileList.Count == 0)
            {
                Label label = new Label();
                label.Text = "欢迎使用微FTP系统";
                label.Width = 500;
                label.Height = 30;
                label.ForeColor = Color.Blue;
                label.Font = new Font(label.Font.FontFamily, 12, label.Font.Style);

                this.flowLayoutPanel1.Controls.Add(label);
            }

        }

private Image GetIcoByExtension(string extension)
        {

            switch (extension)
            {
                case ".doc":
                case ".docx":

                    return Properties.Resources.doc;

                case ".xls":
                case ".xlsx":

                    return Properties.Resources.xls;

                case ".ppt":
                case ".pptx":

                    return Properties.Resources.ppt;
                case ".exe":

                    return Properties.Resources.exe;

                case ".rar":
                case ".zip":
                case ".7z":

                    return Properties.Resources.rar;

                case ".pdf":

                    return Properties.Resources.pdf;

                case ".jpg":
                case ".png":
                case ".bmp":
                case ".gif":
                case ".jpeg":
                case ".tiff":
                    return Properties.Resources.jpg;
                case ".avi":
                case ".mov":
                case ".asf":
                case ".wmv":
                case ".ra":
                case ".ram":
                case ".flv":
                case ".mpg":
                case ".3gp":
                case ".rmvb":
                case ".mp4":
                case ".mpeg":
                case ".dat":
                case ".vob":
                    return Properties.Resources.video;

                case ".txt":
                    return Properties.Resources.txt;

                case ".htm":
                    return Properties.Resources.htm;

                default:
                    return Properties.Resources.rar;
            }
        }

GetIcoByExtension 根据文件类型不同,显示不同的图标

using System;
using System.Collections.Generic;
using System.Text;
using ProtoBuf;

namespace DocManage.Business
{
    [ProtoContract]
    public class ReqDocDirectoryContract
    {
        [ProtoMember(1)]
        public string FileDir { get; set; }

        public ReqDocDirectoryContract() { }
        public ReqDocDirectoryContract(string fileDir)
        {
            this.FileDir = fileDir;
        }

    }
}

ReqDocDirectoryContract

using System;
using System.Collections.Generic;
using System.Text;
using ProtoBuf;

namespace DocManage.Business
{
    [ProtoContract]
    public class FileDetail
    {
        [ProtoMember(1)]
        public string Name{get;set;}
        [ProtoMember(2)]
        public long Size { get; set; }
        [ProtoMember(3)]
        public string Extension { get; set; }
        [ProtoMember(4)]
        public DateTime CreationTime { get; set; }

        public FileDetail() { }

        public FileDetail(string fileName, long fileSize)
        {
            this.Name = fileName;
            this.Size = fileSize;
        }

        public FileDetail(string fileName, long fileSize,string extension,DateTime  creationTime)
        {
            this.Name = fileName;
            this.Size = fileSize;
            this.Extension = extension;
            this.CreationTime = creationTime;
        }

    }
}

FileDetail

服务器端对应的代码:

 NetworkComms.AppendGlobalIncomingPacketHandler<ReqDocDirectoryContract>("GetRcDocDirectory", IncomingReqFileList);
 private void IncomingReqFileList(PacketHeader header, Connection connection, ReqDocDirectoryContract body)
        {
            try
            {
                DocManager docManager = new DocManager();

                DocDirectory theDir = docManager.GetDocDirectory(body.FileDir);

                connection.SendObject<DocDirectory>("ResRcDocDirectory", theDir);

            }
            catch (Exception ex)
            {
                LogTools.LogException(ex, "IncomingReqRcDoc");
            }
        }

 using System;
using System.Collections.Generic;
using System.Text;
using DocManage.Business;
using System.IO;

namespace DocManage.AppServer
{
    public class DocManager
    {

        //doc目录路径
        #region DocDirectoryPath
        private string docDirectoryPath = "";
        public string DocDirectoryPath
        {
            get
            {
                return this.docDirectoryPath;
            }
            set
            {
                this.docDirectoryPath = value;
            }
        }
        #endregion

        public DocManager()
        {
            this.docDirectoryPath = System.Configuration.ConfigurationManager.AppSettings["DocDirectoryPath"];
        }

        //获取某目录下的文件
        public DocDirectory GetDocDirectory(string docDir)
        {
            try
            {
                IList<FileDetail> theFileList = new List<FileDetail>();

                DocDirectory plDirectory = new DocDirectory();

                docDir = docDirectoryPath + @"\" + docDir;

                if (Directory.Exists(docDir))
                {

                    DirectoryInfo curInfo = new DirectoryInfo(docDir);

                    foreach (FileInfo info in curInfo.GetFiles())
                    {  

                    //    theFileList.Add(new FileDetail(info.Name, info.Length));
                        theFileList.Add(new FileDetail(info.Name, info.Length, info.Extension, info.CreationTime));
                    }
                }
                //else
                //{
                //    theFileList.Add(new FileDetail("文件不存在", 1000));
                //}

                plDirectory.FileList = theFileList;

                return plDirectory;
            }
            catch (Exception ex)
            {
                LogTools.LogException(ex, "DocManager.GetDocDirectory");
                return null;
            }
        }
}
}
}

DocManager

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using ProtoBuf;
using System.ComponentModel;

namespace DocManage.Business
{
    [ProtoContract]
    public class DocDirectory
    {
        [ProtoMember(1)]
        public IList<FileDetail> FileList { get; set; }

        [DefaultValue(false), ProtoMember(2)]
        private bool IsEmptyList
        {
            get { return FileList != null && FileList.Count == 0; }
            set { if (value) { FileList = new List<FileDetail>(); } }
        }

        public DocDirectory() { }

    }
}

DocDirectory

文件信息显示控件代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.CompilerServices;
using DocManage.Business ;

namespace DocManage.AppClient
{
    public partial class ImageItemButton : UserControl
    {
        private Image p1;

        //文件事件参数
        public event EventHandler<FileEventArgs> NewDoubleClick;

        //捕捉鼠标单击事件
        public event EventHandler<EventArgs>   NewClick;

        //鼠标离开事件
        public event EventHandler<EventArgs> NewMouseLeave;

        //鼠标经过事件

        public event EventHandler<EventArgs> NewMouseHover;

        //下载文件
        public event EventHandler<FileEventArgs> NewDownFile;
        //打开文件
        public event EventHandler<FileEventArgs> NewOpenFile;
        //删除文件
        public event EventHandler<FileEventArgs> NewRemoveFile;

        public ImageItemButton()
        {
            InitializeComponent();
        }

        [Category("重要属性")]
        [Description("按钮默认显示的图片")]
        public Image ButtonImage
        {
            get
            {
                return this.pbImage.Image;
            }
            set
            {
                this.pbImage.Image = value;
                this.p1 = value;
            }
        }
        [Category("重要属性")]
        [Description("按钮中要显示的文本")]
        public string ButtonText
        {
            get
            {
                return this.lblTemp.Text;
            }
            set
            {
                this.lblTemp.Text = value;
            }
        }

        public FileDetail FileInfo{ get; set;}

        private void ImageButton_Resize(object sender, EventArgs e)
        {
            this.lblTemp.Left = 35;
            this.lblTemp.Top = 6;
        }

        private void ImageButton_Load(object sender, EventArgs e)
        {

            this.pbImage.Image = this.p1;
            this.lblTemp.Left = 35;
            this.lblTemp.Top = 6;
        }

        private void lblTemp_TextChanged(object sender, EventArgs e)
        {
            this.lblTemp.Parent = this;
            this.lblTemp.Width = 515;

            this.lblTemp.Left = 35;
            this.lblTemp.Top = 6;
        }

        //PictureBox事件
        private void pbImage_BackgroundImageChanged(object sender, EventArgs e)
        {
            this.pbImage.Refresh();
        }

        //在文字上双击
        private void lblTemp_DoubleClick(object sender, EventArgs e)
        {
            NewDoubleClick.Raise(this,new FileEventArgs(this.FileInfo));
        }

        //在左侧图片上双击
        private void pbImage_DoubleClick(object sender, EventArgs e)
        {

            NewDoubleClick.Raise(this, new FileEventArgs(this.FileInfo));
        }

        private void ImageItemButton_DoubleClick(object sender, EventArgs e)
        {
            NewDoubleClick.Raise(this, new FileEventArgs(this.FileInfo));
        }

        private void ImageItemButton_Click(object sender, EventArgs e)
        {

            NewClick.Raise(this, e);
        }

        private void lblTemp_Click(object sender, EventArgs e)
        {
            NewClick.Raise(this, e);
        }

        private void pbImage_Click(object sender, EventArgs e)
        {
            NewClick.Raise(this, e);
        }

        private void ImageItemButton_MouseLeave(object sender, EventArgs e)
        {
            NewMouseLeave.Raise(this, e);
        }

        private void 下载文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NewDownFile.Raise(this, new FileEventArgs(this.FileInfo));
        }

        private void 打开文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NewOpenFile.Raise(this, new FileEventArgs(this.FileInfo));
        }

        private void ImageItemButton_MouseHover(object sender, EventArgs e)
        {

            NewMouseHover.Raise(this, e);
        }

        private void lblTemp_MouseHover(object sender, EventArgs e)
        {
            NewMouseHover.Raise(this, e);
        }

        private void pbImage_MouseHover(object sender, EventArgs e)
        {
            NewMouseHover.Raise(this, e);
        }

        private void 删除文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NewRemoveFile.Raise(this, new FileEventArgs(this.FileInfo));
        }

    }
}

ImageItemButton

 //包含文件信息的事件参数
    public class FileEventArgs : EventArgs
    {
        public FileEventArgs(FileDetail  fileInfo)
        {
            FileInfo = fileInfo;

        }
        public FileDetail FileInfo { get; set; }
    }

FileEventArgs

控件下载地址

这个控件好像也是从园子中下载的,并稍微扩展,具体出处找不到了,感谢原作者。

祝大家新年快乐

www.networkcomms.cn编辑

时间: 2024-10-12 16:08:46

WinForm控件分享之文件信息显示控件【c#源码】的相关文章

最近建了一个.net源码共享群,群共享有大量网友分享的.net(C#)商业源码

.net源码共享群 324087998. 本群创建于2013/6/21: 群里都是.net(C#)程序开发人员,群共享有大量网友分享的.net(C#)商业源码.比如:DTCMS旗舰版,hishop微分销,shopnum微分销,多用户微信公众平台开发,力软信息化快速开发框架.源码研究,源码共享,.net反编译破解,.net破解反编译,技术研究交流! 之前在CSDN上发了一下,现在群里有六七百人了.马上就满员了,第二个群又要开始了.群友都是很活跃的,现在群等级满级了. 这是之前文章内容: 由于工作需

分享7款web前端的精美源码预览下载

HTML5的强大之处不仅在于让网页元素更加灵活多变,更在于它可以很方便地实现各种网页动画特效,让你的网站更加富有现代化特色.就现在的浏览器而言,已经基本都支持HTML5了,所以这也方便了我们开发者免去了考虑浏览器兼容性的头疼问题. 1.纯css3实现的图片3D翻转幻灯片 之前介绍了好多款网页幻灯片,今天要给大家再带来一款纯css3实现的图片3D翻转幻灯片.这款幻灯片图片轮播采用了3D翻转的形式,效果非常不错. 在线演示 源码下载 2.jQuery/CSS3实现超酷的动画Tab菜单 这是一款基于j

CodeFolderClear 自动清理代码文件夹下无用文件的小程序及源码

最近常要用U盘拷贝代码,发现编译器生成的各种中间文件占用了大量的空间,手工删除起来费时费力,所以就萌生了写一个小工具搞定这一切都念头. 说干就干,晚上熬夜搞定! 小工具程序及源码工程的下载链接:    点击下载 用简单的方式进行处理,递归删除.下面统计量下要删除的文件: 工程目录下: 工程目录的判断依据: 有工程文件 *.vcxproj *.sdf *.suo *.user 生成目录(Debug/Release等)下的文件: *.obj *.cache *.exp *.ilk *.lastbui

基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址

转载请说明原出处,谢谢~~ 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度,我只是按照原来作者的demo,把相应的消息封装成duilib对应的. 在此首先要感谢wke内核的作者BlzFans以及soui2界面库的作者flyhigh,BlzFans精简了webkit内核后封装为wke并公布了源码,flyhigh对wke进行处理让他更容易移植到dui工程中.wke内核10M大

Android自定义控件:Android L控件点击水波纹的实现(源码 + Demo)

实现思路来自singwhatiwanna http://blog.csdn.net/singwhatiwanna/article/details/42614953 Demo: 一.控件的流程: 大致上如下,实际是有些偏差的大家可以自己画画 RevealLayout()--->init()--->onMeasure()--->onLayout()--->onDraw()--->dispatchTouchEvent()--->getTargetView()--->is

分享拉菲平台搭建教程材料拉菲源码一份服务器域名

今天向大家分享一套拉菲源码的搭建教程,该教程为自己结合自身经验所编制的,如果疑问可以咨询QQ:212303635,如果在搭建方面有不懂的也可以咨询我! 现在向大家讲述所需的材料 首先: 1.服务器(要求Windows2008 R2)64位操作系统 2.环境要求:zkeysPHP的环境组件 3.PHPstyle 4.Mysql数据库 5..最重要的是拉菲源码一份(这边可以先大家分享一下下载链接:http://aqiulian.com/forum.php?mod=viewthread&tid=247

分享一套 手机点餐系统源码 (可随意使用)

很久没有上博客园了,分享一些个人源代码,应该有一些值得初学者学习的地方,比如一些业务的处理技巧,code first,jsonp数据交互,缓存的使用,程序设计等,有一些共用库类可直接拿来使用. 提供在线演示:http://www.wdingdang.com/helper/index (使用手册相当于功能说明,我就不复制到这里了) (非宣传广告,已放弃推广运营,现在纯粹分享源代码) 源码下载地址:http://pan.baidu.com/s/1kT3v1X1 若你们对其中某一块功能感兴趣,我再用业

Spring MVC 4使用Servlet 3 MultiPartConfigElement实现文件上传(带源码)

[本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看.源码下载地址在文章末尾.] [翻译 by 明明如月 QQ 605283073] 原文地址:http://websystique.com/springmvc/spring-mvc-4-file-upload-example-using-multipartconfigelement/ 上一篇:Spring MVC 4 使用常规的fileupload上传文件(带源码) 下一篇:Spring MVC 4 文件下载实例(带源码)

微信分享到朋友圈给分享链接加上图片和文案【源码】

参考源码: 1.0假如微信6.02 不能看到分享链接后面的图片的话: 在body里面添加如下代码:(相应的位置改为你需要的) <img style="width:1px; height:1px;" src="http://web.socialab.com.cn/static/itzu/images/pic300.jpg" alt="" /> var dataForWeixin = { appId: "", img: