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

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


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;  // 这句为什么还要指定?