程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> listview-wpf點擊treeviewitem節點顯示文件,但點擊調用Process.Start方法拋出異常

listview-wpf點擊treeviewitem節點顯示文件,但點擊調用Process.Start方法拋出異常

編輯:編程解疑
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);
            }



        }

    }

最佳回答:


list1對像在不斷改變中, huantu(ListView listview1, List files) 參數files是list1對象的引用;

多線程情況下是不安全的。

如果一個線程正在遍歷時 for (int i = 0; i < files.Count; i++),另外一個線程執行list1.Clear();
大小就變成0了,自然就索引超出范圍

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved