遞歸遍歷文件夾下的所有子目錄,並將每一個節點綁定到一個文件夾中,點擊節點則調用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了,自然就索引超出范圍