wpf点击treeviewitem节点显示文件,但点击调用Process.Start方法抛出异常
递归遍历文件夹下的所有子目录,并将每一个节点绑定到一个文件夹中,点击节点则调用huantu方法,用listview控件显示文件名,为每一个listviewitem节点动态定义listviewitem节点点击事件,并调用 System.Diagnostics.Process.Start();方法打开。       可问题就出现在这里,当我点击listviewitem节点,也就是调用 System.Diagnostics.Process.Start();方法时却爆出“索引超出范围。必须为非负值并小于集合大小”的异常,我细心的找了一下,丹找不到问题出在哪,求各位大神帮我解决

public void BindTreeView2(string path, TreeViewItem tree1, TreeView tree2,ListView lv)
{
DirectoryInfo di = new DirectoryInfo(path);
DirectoryInfo[] dirs = di.GetDirectories();//取得路径数组
foreach (DirectoryInfo i in dirs)
{
TreeViewItem ziDt = new TreeViewItem(); //递归遍历文件夹,并将文件夹的树形结构装入treeviewitem节点
ziDt.Header = i.Name;
tree1.Items.Add(ziDt);

            ziDt.Selected += new RoutedEventHandler(delegate (object shabi, RoutedEventArgs r)
            {  //选中节点, 便利节点对应文件夹下的所有文件夹路径和文件路径,然后调用huantu方法在listview控件中
               //显示这些文件名
                lv.Items.Clear();
                if (ziDt.Header == ((TreeViewItem)tree2.SelectedItem).Header)
                {
                    list1.Clear(); //清空之前选中节点所取得的所有路径

                    string[] directory1 = Directory.GetDirectories(i.FullName);
                    foreach (string a in directory1)  //将目录下的文件夹路径加到list1
                    {
                        list1.Add(a);
                    }
                    directory1 = null;
                     directory1 = Directory.GetFiles(i.FullName);
                    foreach (string a in directory1)      //将目录下的文件路径加到list1
                    {
                        list1.Add(a);
                    }
                   Data.huantu(lv,list1);

                }


            });
            BindTreeView2(i.FullName, ziDt, tree2,lv); 
        }
    }

            //换图方法
            public static void huantu(ListView listview1, List<string> files)

    {
        for (int i = 0; i < files.Count; i++)
        {

                if (!File.Exists(files[i]))
                {
                    continue;
                }
                else
                {
                lv = new ListViewItem();
                Thickness thick = new Thickness(5);
                lv.Margin = thick;
                lv.Content = System.IO.Path.GetFileName(files[i]);
                lv.Width = 120;
                lv.FontSize = 20;


                lv.MouseDoubleClick += delegate (object sender1, MouseButtonEventArgs e1)
                {
                **//系统提示出现异常“索引超出范围。必须为非负值并小于集合大小”的代码在这里 ↓,但以我的水平目前找不到问题出在哪,求大神解决****
                    System.Diagnostics.Process.Start(files[i]);


                };
                listview1.Items.Add(lv);
            }



        }

    }

1个回答

list1对像在不断改变中, huantu(ListView listview1, List files) 参数files是list1对象的引用;

多线程情况下是不安全的。

如果一个线程正在遍历时 for (int i = 0; i < files.Count; i++),另外一个线程执行list1.Clear();
大小就变成0了,自然就索引超出范围

u011606457
_1_1_7_ 回复qq_34612730: 方法做一下同步,list1在传参时可以考虑拷贝一个副本作为临时变量
接近 4 年之前 回复
u011606457
_1_1_7_ 回复qq_34612730: 方法做一下同步,李斯特
接近 4 年之前 回复
qq_34612730
qq_34612730 回复qq_34612730: 把for循环改成foreach就解决了
接近 4 年之前 回复
qq_34612730
qq_34612730 那解决办法是什么啊,如果消除list1.Clear(); ,那么上一个节点选取的fils,会保留;即使消除list1.Clear(); ,还是会抛出异常
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问