2012-09-08 24 views
0

내 프로그램은 정상적으로 실행되지만 약간의 문제가 있습니다. 이전에 기존 파일을 ListBox에 새 트랙을 추가하면 프로그램에 오류가 발생합니다. 이 코드는 다른 시간에 추가 된 새 파일에서 루핑을하지 않으려 고합니다. 도와주세요. 감사합니다 ....이 문제를 해결하는 방법

파일이 존재 그럼 당신은 덜 하나 개의 파일을 추가
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

안녕하세요, Rida! [조사를 해보고] (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

의 의견을 기반으로 편집

button1을 클릭하여 목록 상자에 파일을 한 번 더 추가 할 수 있습니다. 목록 상자에 새 파일이 추가되지만 배열은 배열의 이전 항목을 잃어 버릴 것이고 배열의 개수는 목록 상자의 항목보다 작아 질 것입니다.

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

방금 ​​array에 대한 참조를 선언했지만 요소에 대해 공간을 할당하지 않았습니다. 방금 대답을 업데이트했습니다. – Adil

+0

@Index는 Array의 경계 밖에 있었고, C#의 새로운 prgramm입니다. prgm이 나에게 화가났습니다. 실제로 moarning과 itz night 이후이 problm을 수정하려고 시도했지만 아직 이걸로 붙어 있습니다. – Rida

3

아딜은 문제의 원인을 끌었다하지만, 거기 청소기 솔루션입니다 : 더 나은

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

는 ... 나 :

listBox1.Items.AddRange(files); 

사실, 내가 가고 싶어 인스턴스 변수 filespaths을 완전히 제거 할 수 있습니다. 나는 Tuple<string, string>을 사용하거나 파일/클래스 쌍에 대한 클래스를 만들 것입니다. 그런 다음,listBox1.Items완벽한 데이터 항목을 추가 할 수 있습니다 file 부분이 표시되도록 DisplayMember을 설정하지만, 선택된 인덱스가 변경 될 때, 선택한 항목에서 경로를 가져옵니다. 그렇다면 인덱스를 전혀 사용하지 않아도됩니다.

+0

'Tuble '을 사용하는 코드는 어떻게 생겼습니까? – radbyx

+0

문제는 여전히 여기에 있습니다 : ((( – Rida

+0

@radbyx :'SafeFileNames'와'FileNames'에있는 각 항목에 대해'Tuple '을 추가합니다.) 아마도 가장 간단하게'Zip' LINQ 연산을 사용했을 것입니다 . –

1

나는 Jon과 Adil이 절대적으로 맞고 문제의 일부를 해결하기 위해 코드를 확실히 사용할 수 있다고 생각한다. 하지만 내 생각 엔 paths에 요소가 없으므로 요소를 가져 오려고하면 예외가 발생합니다. 당신은 여전히 ​​예외가 발생하는 경우

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

참조하지 않는 경우에, 당신은 당신의 paths 변수가 설정되지 않는 또는 왜 목록 상자에 선택된 인덱스보다 큰 이유의 또 다른 문제가있다 : 당신은 다음과 같은 코드를 시도 할 수 있습니다 변수의 요소

+0

여전히 작동하지 않습니다. – Rida

+0

애플리케이션을 디버그하고 예외가 throw됩니다? 디버깅하려면이 두 줄에 중단 점을 배치하십시오. file = 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

이 질문에 직접 대답하지만 시트의 대답은 더 깨끗한 솔루션입니다 동의합니다. 배열을 전혀 사용하지 마십시오. 목록 상자 항목에서 이름과 경로를 전달하십시오. – RaoulRubin

+0

여전히 작동하지 않음 – Rida

관련 문제