2012-09-08 27 views
0

我的程序運行正常,但有一個小問題。當我將以前存在的新文件添加到列表框時,程序會遇到錯誤。代碼似乎不願意在不同時間添加的新文件中循環。請幫幫我。謝謝....如何解決這個問題拋出IndexOutOfBoundsException

public partial class Form1 : Form 
{ 
    //... 

    string[] files, paths; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      files = openFileDialog1.SafeFileNames; 
      paths = openFileDialog1.FileNames; 
      for (int i = 0; i < files.Length - 1; i++) 
      { 
       listBox1.Items.Add(files[i]); 
      } 
     } 
    } 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     axWindowsMediaPlayer1.URL = paths[listBox1.SelectedIndex]; 
    } 
} 
+5

歡迎,日達!請[做一些研究](http://whathaveyoutried.com)並使用調試器來縮小問題的範圍,然後制定一個更精確的問題(如[問]中所示),只包含*相關*代碼。謝謝。 – Adam

回答

2

您要添加一個文件小於文件存在,當你要訪問的最後

變化

for (int i = 0; i < files.Length - 1; i++) 
{ 
    listBox1.Items.Add(files[i]); 
} 

for (int i = 0; i < files.Length; i++) 
{ 
    listBox1.Items.Add(files[i]); 
} 

根據意見編輯OP

你可能會在列表框中更通過點擊按鈕1被添加文件,然後一次。這將在列表框中添加新文件,但數組將丟失數組中的以前的項目,並且數組中的計數將小於列表框中的項目。

private void button1_Click(object sender, EventArgs e) 
{ 
    listBox1.Items.Clear(); //Clear the items of list box to keep the same items in both listbox and in array paths. 
    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     files = openFileDialog1.SafeFileNames; 
     paths = openFileDialog1.FileNames; 
     for (int i = 0; i < files.Length ; i++) 
     { 
       listBox1.Items.Add(files[i]); 
     } 
     }   
} 

如果你想保留前面的選擇,然後使用列表而不是數組,因爲列表可以更容易地增長,然後數組。

string[] files; 
List<string> paths = new List<string>() ; 
private void button1_Click(object sender, EventArgs e) 
{   
    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     files = openFileDialog1.SafeFileNames; 
     paths.AddRange(openFileDialog1.FileNames.ToList()); 
     for (int i = 0; i < files.Length; i++) 
     { 
      listBox1.Items.Add(files[i]); 
     } 
    }   
} 
+0

其不工作 for(int i = 0; i Rida

+0

你剛剛聲明瞭數組的引用,但沒有爲元素分配空間。我剛剛更新了我的答案。 – Adil

+0

@Index是在數組的邊界之外,是c#的新prgram,並且prgm讓我生氣其實我是tryng來修復這個問題,因爲現在moarning和itz晚了,但仍然堅持這個 – Rida

3

阿迪爾已經抓住了問題的原因,但有一個清潔的解決方案:

foreach (string file in files) 
{ 
    listBox1.Items.Add(file); 
} 

...甚至更好:

listBox1.Items.AddRange(files); 

事實上,我會去甚至更進一步,並完全擺脫實例變量filespaths。我要麼使用Tuple<string, string>,要麼爲文件/類對創建一個類。然後,你可以在每個完整的數據項添加到listBox1.Items,設置DisplayMember使得file部分顯示出來,但是當所選擇的指數變化,從所選擇的項目獲取路徑。那麼就沒有必要混淆索引了。

+0

如何使用'Tuble'的代碼看起來像? – radbyx

+0

問題仍然存在:(((( – Rida

+0

@radbyx:你會爲'SafeFileNames'和'FileNames'中的每個項目添加一個'Tuple <字符串,字符串>',這可能是通過'Zip' LINQ操作完成的。 –

1

我覺得既喬恩和阿迪爾是完全正確的,你絕對可以使用自己的代碼來解決這個問題的一部分。但是,我的猜測是你在paths中沒有任何元素,所以當你試圖從中獲取元素時,它會拋出異常。你可以試試下面的代碼:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (paths.Length >= listBox1.SelectedIndex) 
     axWindowsMediaPlayer1.URL = paths[listBox1.SelectedIndex]; 
} 

看看你仍然拋出一個異常,如果沒有,那麼你爲什麼你paths變量沒有被設置或者爲什麼列表框選擇指數大於的另一個問題變量中的元素。

+0

仍然不能正常工作 – Rida

+0

我可以問你調試應用程序,看看究竟在哪裏拋出異常?調試時,在這兩行放置一個斷點文件= openFileDialog1.SafeFileNames; files = openFileDialog1.SafeFileNames;然後你可以一步拋出代碼,一旦你知道你被拋出的異常,你可以發佈你的結果在這裏再次 – MaxDataSol

+0

axWindowsMediaPlayer1.URL =路徑[listBox1.SelectedIndex]; 在這裏出錯 – Rida

1

我不認爲這個問題是將項目添加到陣列。更可能的原因是SelectedIndexChanged事件處理程序。您應該檢查SelectedIndex以確保它是有效的。

int idx = listBox1.SelectedIndex; 
if (paths != null && idx > 0 && idx < paths.Length) 
{ 
    axWindowsMediaPlayer1.URL = paths[idx]; 
} 
+0

這直接回答了這個問題,但我同意Sheet的答案是一個更清潔的解決方案。根本不要使用數組。在列表框項目中傳遞名稱和路徑。 – RaoulRubin

+0

仍然無法正常工作 – Rida

相關問題