C# 从 treeView 项目位置打开 listView 项目 [英] C# Open listView Item from treeView item location

查看:24
本文介绍了C# 从 treeView 项目位置打开 listView 项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一种方法来允许打开 ListView 中显示的文件.ListView 中的项目从 TreeView 中显示出来.看看我下面的代码以了解更多细节.

此表单的代码

使用系统;使用 System.Collections.Generic;使用 System.ComponentModel;使用 System.Data;使用 System.Drawing;使用 System.Linq;使用 System.Text;使用 System.Threading.Tasks;使用 System.Windows.Forms;使用 System.IO;命名空间OSTP{公共部分类 User1FileExplorer :表单{公共 User1FileExplorer(){初始化组件();填充树视图();this.treeView1.NodeMouseClick +=新的 TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick);}private void User1FileExplorer_Load(对象发送者,EventArgs e){}私有无效 PopulateTreeView(){树节点根节点;DirectoryInfo info = new DirectoryInfo(@"C:\Users\Oliver\Documents\.OSTP\User1\Files\Documents");如果(信息.存在){rootNode = new TreeNode(info.Name);rootNode.Tag = 信息;GetDirectories(info.GetDirectories(), rootNode);treeView1.Nodes.Add(rootNode);}}private void GetDirectories(DirectoryInfo[] subDirs,TreeNode nodeToAddTo){TreeNode aNode;DirectoryInfo[] subSubDirs;foreach(子目录中的目录信息子目录){aNode = new TreeNode(subDir.Name, 0, 0);aNode.Tag = subDir;aNode.ImageKey = "文件夹";subSubDirs = subDir.GetDirectories();如果(subSubDirs.Length != 0){GetDirectories(subSubDirs, aNode);}nodeToAddTo.Nodes.Add(aNode);}}私有无效 treeView1_NodeMouseClick(对象发送者,TreeNodeMouseClickEventArgs e){TreeNode newSelected = e.Node;listView1.Items.Clear();DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;ListViewItem.ListViewSubItem[] subItems;ListViewItem item = null;foreach(nodeDirInfo.GetDirectories() 中的目录信息目录){item = new ListViewItem(dir.Name, 0);subItems = new ListViewItem.ListViewSubItem[]{new ListViewItem.ListViewSubItem(item, "目录"),新的 ListViewItem.ListViewSubItem(item,dir.LastAccessTime.ToShortDateString())};item.SubItems.AddRange(subItems);listView1.Items.Add(item);}foreach(nodeDirInfo.GetFiles() 中的 FileInfo 文件){item = new ListViewItem(file.Name, 1);subItems = new ListViewItem.ListViewSubItem[]{ new ListViewItem.ListViewSubItem(item, "File"),新的 ListViewItem.ListViewSubItem(item,file.LastAccessTime.ToShortDateString())};item.SubItems.AddRange(subItems);listView1.Items.Add(item);}listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);}}}

正如您从我的代码中看到的,我使用 TreeView 来选择文件的目录,然后使用 ListView 来显示目录中的文件.

我希望这样,当用户双击 ListView 中的文件时,它会打开.当我说打开时,我并不是说打开一个文本文件.因此,假设用户双击 ListView 中的文本文件 1,我希望它显示 User1TextFile1.cs.这是因为文本文件被加载到文本框中.

我知道这有点复杂,所以如果我遗漏了什么,请发表评论.

谢谢.

更新

当我添加 MessageBox.Show("" + lvHti);

解决方案

要找出哪个 ListViewItem 被单击或双击,请使用 MouseClickMouseDoubleClick 事件.

在这里你可以简单地编码:

ListViewItem lvItem = null;如果(listView1.SelectedItems.Count > 0)lvItem = listView1.SelectedItems[0];

前提是 ListViewMultiSelect = false.

如果你允许多选,你需要做一个HitTest来找出用户点击的位置:

ListViewItem lvItem = null;ListViewHitTestInfo lvHti = listView1.HitTest(e.Location);if (lvHti.Item != null) lvItem = lvHti.Item;

现在您可以访问 Item 和/或其 SubItems 来处理选择.

I'm needing a way to allow the files that are displayed in the ListView to be opened. The Items In the ListView are displayed from the TreeView. Take a look at my code below to see in more detail.

Code for this form

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace OSTP
{
    public partial class User1FileExplorer : Form
    {
        public User1FileExplorer()
        {
            InitializeComponent();
            PopulateTreeView();
            this.treeView1.NodeMouseClick +=
    new TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick);
        }

        private void User1FileExplorer_Load(object sender, EventArgs e)
        {

        }
        private void PopulateTreeView()
        {
            TreeNode rootNode;

            DirectoryInfo info = new DirectoryInfo(@"C:\Users\Oliver\Documents\.OSTP\User1\Files\Documents");
            if (info.Exists)
            {
                rootNode = new TreeNode(info.Name);
                rootNode.Tag = info;
                GetDirectories(info.GetDirectories(), rootNode);
                treeView1.Nodes.Add(rootNode);
            }
        }

        private void GetDirectories(DirectoryInfo[] subDirs,
            TreeNode nodeToAddTo)
        {
            TreeNode aNode;
            DirectoryInfo[] subSubDirs;
            foreach (DirectoryInfo subDir in subDirs)
            {
                aNode = new TreeNode(subDir.Name, 0, 0);
                aNode.Tag = subDir;
                aNode.ImageKey = "folder";
                subSubDirs = subDir.GetDirectories();
                if (subSubDirs.Length != 0)
                {
                    GetDirectories(subSubDirs, aNode);
                }
                nodeToAddTo.Nodes.Add(aNode);
            }
        }

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode newSelected = e.Node;
            listView1.Items.Clear();
            DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
            ListViewItem.ListViewSubItem[] subItems;
            ListViewItem item = null;

            foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
            {
                item = new ListViewItem(dir.Name, 0);
                subItems = new ListViewItem.ListViewSubItem[]
            {new ListViewItem.ListViewSubItem(item, "Directory"), 
             new ListViewItem.ListViewSubItem(item, 
                dir.LastAccessTime.ToShortDateString())};
                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }
            foreach (FileInfo file in nodeDirInfo.GetFiles())
            {
                item = new ListViewItem(file.Name, 1);
                subItems = new ListViewItem.ListViewSubItem[]
            { new ListViewItem.ListViewSubItem(item, "File"), 
             new ListViewItem.ListViewSubItem(item, 
                file.LastAccessTime.ToShortDateString())};

                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }

            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }
    }
}

As you can see from my code I use a TreeView to select the directory for the files then the ListView to display the files inside of the directory.

I would like it so when the user double clicks the file in the ListView it opens. And when I say open I'm not meaning open a text file as such. So lets say the user double clicks text file 1 in the ListView, I would like it to show User1TextFile1.cs. This is because the text files are loaded into a text box.

I know this is a little complicated, so If I have missed anything please drop a comment.

Thanks.

UPDATE

http://pastebin.com/BgVdLavL

UPDATE2

When I add MessageBox.Show("" + lvHti);

解决方案

To find out which ListViewItem was clicked or doubleclicked use the MouseClick or the MouseDoubleClick event.

Here you can either code simply:

ListViewItem lvItem = null;

if (listView1.SelectedItems.Count > 0)
    lvItem = listView1.SelectedItems[0];

provided the ListView has MultiSelect = false.

If you allow multiple selections you need to do a HitTest to find out where the user has clicked:

ListViewItem lvItem = null;

ListViewHitTestInfo lvHti = listView1.HitTest(e.Location);
if (lvHti.Item != null) lvItem = lvHti.Item;

Now you can access the Item and/or its SubItems to process the choice.

这篇关于C# 从 treeView 项目位置打开 listView 项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆