求教关于点击TreeView节点后刷新ListView数据的有关问题
求教关于点击TreeView节点后刷新ListView数据的问题
我想实现一个类似于电脑的资源管理器的功能,左边是TreeView的目录结构树,右边是用ListView显示的目录内容。其中,我的目录结构树是从数据库表里面读取出来的。我先实现点击左边的TreeView目录树中的某一个目录文件夹名字后,在右边的ListView中绑定显示出该选择的文件夹目录里的图片文件。我现在基本功能实现了,但是发现一个比较奇怪的问题就是,要点击左边的TreeView的节点两次才会显示正常。


------解决思路----------------------
看起来你加载树的递归怪怪的
调试一下,第一次afterselect事件,folderId是否为空?
------解决思路----------------------
我想实现一个类似于电脑的资源管理器的功能,左边是TreeView的目录结构树,右边是用ListView显示的目录内容。其中,我的目录结构树是从数据库表里面读取出来的。我先实现点击左边的TreeView目录树中的某一个目录文件夹名字后,在右边的ListView中绑定显示出该选择的文件夹目录里的图片文件。我现在基本功能实现了,但是发现一个比较奇怪的问题就是,要点击左边的TreeView的节点两次才会显示正常。
public partial class MaterialBrowser : Form
{
MaterialManager materialManager;
public MaterialBrowser()
{
InitializeComponent();
materialManager = new MaterialManager();
txtDirectoryRoot.Text = materialManager.MaterialPath;
InitMaterialCategoryMenu();
}
protected void InitMaterialCategoryMenu()
{
tvLeftMenu.Nodes.Clear();
tvLeftMenu.Nodes.Add(new TreeNode("素材库目录"));
LoadDirectory(Guid.Empty, tvLeftMenu.Nodes[0]);
}
protected void LoadDirectory(Guid parentId,TreeNode node)
{
//从数据库里获取目录结构
List<CategoryInfo> categories = materialManager.GetAllCategory(parentId) as List<CategoryInfo>;
for (int i = 0; i < categories.Count; i++)
{
node.Nodes.Add(categories[i].CategoryId.ToString(), categories[i].CategoryName);
LoadDirectory(categories[i].CategoryId, node.Nodes[i]);
}
}
//获取目录下的所有图片文件
protected void LoadDirectoryFiles(Guid folderId)
{
List<Material> materials = materialManager.GetAllCategoryFiles(folderId) as List<Material>;
if (materials == null || materials.Count == 0)
{
return;
}
int index = 0;
lvMaterialFiles.Items.Clear();
images.Images.Clear();
lvMaterialFiles.View = View.LargeIcon;
ColumnHeader header = new ColumnHeader();
header.Text = "文件名";
header.Width = 150;
header.TextAlign = HorizontalAlignment.Left;
lvMaterialFiles.Columns.Add(header);
lvMaterialFiles.BeginUpdate();
foreach (Material material in materials)
{
if (material.FileExt.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || material.FileExt.Equals(".jpeg", StringComparison.OrdinalIgnoreCase))
{
string file = materialManager.MaterialPath + "\\" + material.FileName; //这里的结构是E:\\Attach\\2013-1.jpg
Image image = Image.FromFile(file);
images.Images.Add(image);
images.ImageSize = new Size(150, 150);
ListViewItem listViewItem = new ListViewItem();
listViewItem.Text = material.FileName; //这里是从数据库里读出来的图片文件的名字 2013-1.jpg
listViewItem.Tag = file;
listViewItem.ImageIndex = index;
lvMaterialFiles.Items.Add(listViewItem);
lvMaterialFiles.Items[index].ImageIndex = index;
index++;
image.Dispose();
LoadDirectoryFiles(material.ParentId);
}
}
lvMaterialFiles.EndUpdate();
}
//左边的TreeView选择点击事件
private void tvLeftMenu_AfterSelect(object sender, TreeViewEventArgs e)
{
string folderId = tvLeftMenu.SelectedNode.Name;
if (!string.IsNullOrEmpty(folderId))
{
LoadDirectoryFiles(new Guid(folderId));
}
}
------解决思路----------------------
看起来你加载树的递归怪怪的
调试一下,第一次afterselect事件,folderId是否为空?
------解决思路----------------------
listViewItem.ImageIndex = index; // 此处已经指定了index
lvMaterialFiles.Items.Add(listViewItem);
lvMaterialFiles.Items[index].ImageIndex = index; // 这句为什么还要指定?