qq_34612730 2016-06-02 05:17 采纳率: 71.4%
浏览 1496
已采纳

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条回答

  • _1_1_7_ 2016-06-02 07:13
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程