求教关于点击TreeView节点后刷新ListView数据的问题

jasonlee0927 2014-12-09 01:01:29
我想实现一个类似于电脑的资源管理器的功能,左边是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));
}
}
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南小鱼 2014-12-09
  • 打赏
  • 举报
回复
把int index = 0;声明成全局变量? 你递归的时候index重新赋值,不就造成lvMaterialFiles.Items[0]多次被赋值麽?
jasonlee0927 2014-12-09
  • 打赏
  • 举报
回复
搞定了,估计是在ImageList的属性里面设置了ImageSize大小为80*80,而后又在代码里写了images.ImageSize = new Size(150, 150);导致冲突了。我去掉了images.ImageSize = new Size(150, 150);就显示正常了
jasonlee0927 2014-12-09
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:

listViewItem.ImageIndex = index;   // 此处已经指定了index
 
                    lvMaterialFiles.Items.Add(listViewItem);
                    lvMaterialFiles.Items[index].ImageIndex = index;  // 这句为什么还要指定?
去掉了也还是一样。ImageList绑定到ListView怎么就第一显示不出来图片呢
jasonlee0927 2014-12-09
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
看起来你加载树的递归怪怪的 调试一下,第一次afterselect事件,folderId是否为空?
第一次afterselect事件里面folderId不是为空。其实第一次afterselect事件后,显示出来的数据结果是对的(显示2013-1.jpg),只是没有显示出图片而已。所以不知道是不是ListView绑定ImageList出了问题,跟踪又没有发现异常
阿达King哥 2014-12-09
  • 打赏
  • 举报
回复
用click事件,然后通过坐标转换,找到对应的节点。不要通过afterselect。 具体代码我忘记了。
exception92 2014-12-09
  • 打赏
  • 举报
回复

listViewItem.ImageIndex = index;   // 此处已经指定了index
 
                    lvMaterialFiles.Items.Add(listViewItem);
                    lvMaterialFiles.Items[index].ImageIndex = index;  // 这句为什么还要指定?
江南小鱼 2014-12-09
  • 打赏
  • 举报
回复
看起来你加载树的递归怪怪的 调试一下,第一次afterselect事件,folderId是否为空?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧