首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

分享一个容易的资源管理器程序,主要是演示下LINQ在C#开发中的运用

2013-04-26 
分享一个简单的资源管理器程序,主要是演示下LINQ在C#开发中的运用代码下载 http://download.csdn.net/deta

分享一个简单的资源管理器程序,主要是演示下LINQ在C#开发中的运用


代码下载 http://download.csdn.net/detail/caozhy/4169965。

本程序中使用了LINQ语法,简洁性大家可以自己体会,由于LINQ的运用,程序甚至连一个循环语句都不需要。很多人有一种误解,说到LINQ,就是数据库访问,就是ORM框架,就是转化成SQL执行等等,其实这是对LINQ的误解,我想用这个例子程序说明,LINQ没有那么神秘,它就是C# 3时代的一种简单语法,它可以融入到程序的每个角落。大家可以放心大胆地使用LINQ简化开发,书写紧凑的代码。

说一下这个程序的主要意图:

首先看到的是Form_Load,它的作用是加载根节点和驱动器列表:


[解决办法]

分享一个容易的资源管理器程序,主要是演示下LINQ在C#开发中的运用

放一下源码下载的地址。。。

在帖子中看看有点累
[解决办法]
看源码,最近正在学LINQ
分享一个容易的资源管理器程序,主要是演示下LINQ在C#开发中的运用
------解决方案--------------------


Linq让代码简化思路清晰。。。好东西
[解决办法]
支持!!!!!!!!!
[解决办法]
学习了,知识因分享而伟大!谢谢楼主!!!
[解决办法]
好,晒晒更进步
[解决办法]
加强学习
[解决办法]
都先进啊,俺还在用2008
[解决办法]
又见linq,是好工具
[解决办法]
很耐心。分享一个容易的资源管理器程序,主要是演示下LINQ在C#开发中的运用
[解决办法]


逻辑代码:

public class Drives : List<Drive> {
public Drives() {
this.AddRange(DriveInfo.GetDrives().Where(p => p.IsReady).Select(p => new Drive(p)));
}
}

public interface Subject {
string Name { get; set; }
string Path { get; set; }
}

public class File : Subject {
public FileInfo Info { get; set; }
public string Name { get; set; }
public string Path { get; set; }

public File(string arg) : this(new FileInfo(arg)) { }

public File(FileInfo arg) {
this.Path = arg.FullName;
this.Name = System.IO.Path.GetFileName(this.Path);
}
}

public abstract class FileGroup : Subject {
public string Name { get; set; }
public string Path { get; set; }

public FileGroup() { }
public FileGroup(string name) { this.Name = name; }

public IEnumerable<Subject> Folders {
get { return LoadChildren().OfType<Folder>(); }
}

public IEnumerable<Subject> Children {


get { return LoadChildren(); }
}

protected virtual IEnumerable<Subject> LoadChildren() {
if (children == null) {
var target = new DirectoryInfo(Path);

Func<FileSystemInfo, bool> filter = p => !(
p.Attributes.HasFlag(FileAttributes.System) 
[解决办法]

p.Attributes.HasFlag(FileAttributes.Hidden)
);

var q = target.GetDirectories()
.Where(filter)
.Select(p => new Folder(p as DirectoryInfo)).Concat(
target.GetFiles()
.Where(filter)
.Select(p => new File(p as FileInfo))
as IEnumerable<Subject>
);
return q;
}

return children;
}

protected IEnumerable<Subject> children = null;
}

public class Drive : FileGroup {
public DriveInfo Info { get; set; }
public Drive(DriveInfo arg) {
this.Info = arg;
this.Path = arg.RootDirectory.Name;
this.Name = string.Format("{0} ({1})", arg.VolumeLabel, arg.Name);
}
}

public class Folder : FileGroup {
public DirectoryInfo Info { get; set; }
public Folder(string arg) : this(new DirectoryInfo(arg)) { }

public Folder(DirectoryInfo arg) {
this.Info = arg;
this.Path = arg.FullName;
this.Name = arg.Name;
}
}


前台XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:biz="clr-namespace:Finder.Business"
        Title="Finder" Height="500" Width="800">
    <Window.Resources>
        <biz:Drives x:Key="drivers" />
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="300" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TreeView x:Name="treeViewDir" HorizontalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                  ItemsSource="{StaticResource drivers}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Folders}">
                    <TextBlock Text="{Binding Name}" />
                </HierarchicalDataTemplate>


            </TreeView.ItemTemplate>
        </TreeView>
        <GridSplitter Width="4" />
        <ListView Grid.Column="2" ItemsSource="{Binding ElementName=treeViewDir, Path=SelectedValue.Children}"/>
    </Grid>
</Window>


110行代码,搞定UI和逻辑
代码下载 http://nonocast.cn/?p=3041
[解决办法]
纠正:
FileGroup.LoadChildren中
return q;
改为
children = q.ToList();
[解决办法]
不懂这个呢。
[解决办法]
看来我还得继续修炼,惭愧ing
[解决办法]
WPF的树好难看,怎么让树显示前面的引导线?
[解决办法]
看来要好好看看LINQ了。
[解决办法]

直接拿来用就行,Show TreeView nodes connected with dotted lines
[解决办法]
代码是简明了,不过调试呢?好像没有传统方式方便吧,特别是单步跟踪,这个有点感觉不是很爽。
[解决办法]
先要搞明白但不跟踪那些范围的代码。设计师是不去跟踪什么代码的,交互设计有交互设计的诀窍。设计师使用 blend,而不是写代码。
[解决办法]
比如说这里的例子非常直接地调用一下控件就轻松完成了,因为界面调整就是调整一下样式。到底只有哪几条代码需要单步跟踪,这其实只要耐心看一下就能明白了。
[解决办法]
额啊。 linq还是不错的……
[解决办法]
        private void Form1_Load(object sender, EventArgs e)
        {
            treeView1.Nodes.Add(new TreeNode("Computer",
                (new ManagementObjectSearcher("select * from Win32_LogicalDisk").Get().Cast<ManagementObject>().Select(m =>
                    new TreeNode(m["DeviceID"] + "") { Name = m["DeviceID"].ToString()+"\", Tag =  m["CreationClassName"].ToString() }).ToArray())) { Tag = "Root" });
        }

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {


            e.Node.Nodes.Cast<TreeNode>().ToList().ForEach(x =>
            {
                try
                {
                    if (x.Nodes.Count == 0)
                    {
                        TreeNode[] nodes = new TreeNode[] { };
                        string drive = x.Name.Substring(0, 2);
                        string path = x.Name.Replace(drive, "").Replace("\","\\\");
                        if (x.Tag.ToString() == "Win32_LogicalDisk" 
[解决办法]
 x.Tag.ToString() == "File Folder")
                        {
                            string queryTxt = @"select * from  Win32_Directory where drive=""" + drive + @""" and path=""" + path + @"""";
                            nodes = new ManagementObjectSearcher(queryTxt).
                                Get().Cast<ManagementObject>().
                                Select(m => new TreeNode(m["FileName"].ToString()) { Name = m["name"].ToString() + "\", Tag = m["FileType"].ToString() }).ToArray();
                        }
                        x.Nodes.AddRange(nodes);
                    }
                }
                catch { }
            });
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)


        {
            if (e.Node.Text == "Computer")
            {
                listView1.Items.Clear();
                listView1.Items.AddRange(new ManagementObjectSearcher("select * from Win32_LogicalDisk").Get().Cast<ManagementObject>().Select(m =>new ListViewItem(new string[]{
                                m["name"].ToString(),
                                m["Description"].ToString(),
                                (Convert.ToInt64(m["Size"])/ 1048576 / 1024).ToString()+"GB",
                                ""})).ToArray());
            }

            if (e.Node.Tag.ToString() == "Win32_LogicalDisk" 
[解决办法]
 e.Node.Tag.ToString() == "File Folder")
            {
                listView1.Items.Clear();
                string drive = e.Node.Name.Substring(0, 2);
                string path = e.Node.Name.Replace(drive, "").Replace("\", "\\\");
                string queryText = @"select * from  CIM_LogicalFile where drive=""" + drive + @""" and path=""" + path + @"""";
                listView1.Items.AddRange(new ManagementObjectSearcher(queryText).
                                Get().Cast<ManagementObject>().Select(m => new ListViewItem(new string[]{
                                m["FileName"].ToString(),
                                m["FileType"]+"",
                                (Convert.ToInt64(m["FileSize"])/1024).ToString()+"KB",
                                m["CreationDate"]+""})).ToArray());


            }

        }


[解决办法]
碰到个问题,treeView1_BeforeExpand在展开节点的时候假如磁盘类型是可移动存储设备,并且驱动器未准备好的情况下,处理这个节点会花费相当多的时间

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            e.Node.Nodes.Cast<TreeNode>().ToList().ForEach(x =>
                {
                    try
                    {
                        if (x.Nodes.Count == 0)
                        {
                            TreeNode[] nodes = new TreeNode[] { };
                            if (x.Tag.GetType() == typeof(DriveInfo))
                            {
                                var item = x.Tag as DriveInfo;
                                if (item.DriveType == DriveType.Removable && item.IsReady == false)
                                {
                                    string message = "磁盘类型是可移动存储设备,并且驱动器未准备好会花费相当多的时间";
                                }
                                nodes = Directory.GetDirectories(item.Name)
                                    .Select(y => new DirectoryInfo(y))
                                    .Select(y => new TreeNode(y.Name) { Tag = y })


                                    .ToArray();

                            }
                            if (x.Tag.GetType() == typeof(DirectoryInfo))
                            {
                                var item = x.Tag as DirectoryInfo;
                                nodes = Directory.GetDirectories(item.FullName)
                                    .Select(y => new DirectoryInfo(y))
                                    .Select(y => new TreeNode(y.Name) { Tag = y })
                                    .ToArray();
                            }
                            x.Nodes.AddRange(nodes);
                        }
                    }
                    catch { }
                });
        }


是否有办法避免这种情况,求高人指点!

热点排行