C# 从 treeView 项目位置打开 listView 项目 [英] C# Open listView Item from treeView item location
问题描述
我需要一种方法来允许打开 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
被单击或双击,请使用 MouseClick
或 MouseDoubleClick
事件.
在这里你可以简单地编码:
ListViewItem lvItem = null;如果(listView1.SelectedItems.Count > 0)lvItem = listView1.SelectedItems[0];
前提是 ListView
有 MultiSelect = 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
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屋!