2010-12-03 2 views
0

나는 선택한 파일을 저장하는 배열 목록과 파일 이름 만 표시하는 ListBox가 있습니다. 내 요구 사항은 목록 상자에서 삭제 된 arraylist에서 해당 파일을 삭제하는 것입니다 ... 여기 있습니다 내 코드 :C에서 배열 목록에서 파일을 삭제

public ArrayList to_compress = new ArrayList(); 
ListBox pack_lbx=new ListBox(); 

private void add_btn_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog ofd = new OpenFileDialog(); 
    ofd.Multiselect = true; 
    if (ofd.ShowDialog() == DialogResult.OK) 
    { 
     foreach (string f in ofd.FileNames) 
     { 
      FileInfo f_inf = new FileInfo(f); 
      if (pack_lbx.Items.IndexOf(Path.GetFileName(f)) == -1) 
      { 
       to_compress.Add(new string[] { f, f_inf.Name }); 
       pack_lbx.Items.Add(Path.GetFileName(f)); 
      }     
     } 
    } 

    private void remove_btn_Click(object sender, EventArgs e) 
    { 
     // pack_lbx.Items.Remove(pack_lbx.Items); 
     ListBox.SelectedObjectCollection s = pack_lbx.SelectedItems; 
     while (s.Count > 0) 
     { 
      pack_lbx.Items.Remove(s[0]); 
      to_compress.Remove(s.ToString()); //this doesnt work 
     } 
    } 
+0

버튼 이벤트의 비즈니스 로직 !!! 내 눈!!!! –

답변

1

여기에는 질문이 없습니다. 내가 반복적으로 반복하고있는 컬렉션을 수정하려고하기 때문에 오류가 발생했다고 가정합니다.

그게 문제가 아니라면 우리는 더 나은 대답을 줄 수 있도록 질문으로 변경하십시오. 당신은 당신을 통해 반복하고있는 목록을 변경하는 경우에는

, 내가 바로 추측하고 가정 ...

당신은 할 수 없습니다 ... 그것은 일을 망쳐 놨어요.

대신 새 목록을 만들고 루프 목록에서 반복하여 목록을 복사 한 후 원하는 항목에 대해 "추가"코드를 건너 뛰십시오. 지우는 것".

+0

어떤 오류도 발생하지 않고 listbox에서 선택한 파일 이름 (전체 경로가 아님)과 ArrayList()의 파일 이름 (경로 포함)을 채우려고합니다. 목록 상자에서 파일을 삭제하는 string.when 쌍이 필요합니다. ArrayList()에서 해당 항목을 삭제하는 컨트롤이 없습니다. –

0
to_compress.Remove(s[0].ToString()); 
1
while (s.Count > 0) 
    { 
     pack_lbx.Items.Remove(s[0]); 
     to_compress.Remove(s.ToString());//this doesnt work 
    } 

그래서

할 컬렉션을 반복하는 동안 컬렉션에서 개체를 삭제하는 때문에이 작동하지 않습니다이

private void remove_btn_Click(object sender, EventArgs e) 
{ 
    // pack_lbx.Items.Remove(pack_lbx.Items); 
    ArrayList tempList = new ArrayList(); 
    ListBox.SelectedObjectCollection s = pack_lbx.SelectedItems; 
    foreach(string str in to_compress) 
    { 
     if(!s.Contains(str)) 
     tempList.Add(str) 
    } 

    to_compress = tempList; 

}

+0

하지만 s는 파일의 이름 만 포함하고 있습니다. tolecom 이름과 str은 전체 파일 이름을 저장합니다. –

0

내가 할 수있는 ' 파일을 ArrayList to_compress에 추가하는 모든 코드 행을 참조하십시오.

또한 FileInfo 객체를 arraylist에 추가하면 파일 이름을 사용하여 제거 할 수 없습니다.

파일 이름이 키이고 실제 파일 객체가 값인 일반 사전을 사용하는 것이 좋습니다. 동기화 된 두 개의 동일한 목록을 유지하기 위해 노력

 
var to_compress = new Dictionary<string,FileInfo>(); 
to_compress.Add(filename,File); 

//then you can remove by 

to_compress.Remove(filename); 

//you can loop through it like so 
foreach (var pair in to_compress) 
{ 
    string filename = pair.Key; 
    FileInfo file = pair.Value;  
} 
+0

아 ... 미안 해요 ... 주석 처리를 잊어 버렸습니다 ... 편집되었습니다 –

1

은 UI가 프로그램이 무엇인지 다른 정보를 표시합니다, 당신은 단지 한 곳에서 제대로 동기화하지 않을 경우 때문에, 버그까지 당신을 여는 패턴이다 내부적으로 사용.

더 나은 방법은 하나의 "마스터"목록 만 유지하는 것입니다. ListBox에 목록을 보관하고 ListBox에서 조작하고 ListBox에서 파일 이름 만 복사합니다.

목록 상자에 표시된 텍스트를 기본 문자열과 다르게하려면 (예 : 상자의 리프 이름을 표시하지만 전체 경로 이름을 내부적으로 유지하려는 경우) 전체 경로 이름을 보유하고 ToString을 재정의하는 간단한 클래스를 만들 수 있습니다) 잎 이름을 반환합니다. 그런 다음 원시 문자열이 아닌이 클래스의 인스턴스를 ListBox에 추가합니다.

두 목록을 동기화 상태로 유지하려는 경우 RemoveAt() 메서드로 ListBox.SelectedIndex를 사용하고 두 목록에서 같은 항목을 제거하기 만하면됩니다.

당신이, 당신이 할 수있는 하나 열거하는 항목을 목록에서 제거해야하는 경우 : 반복하는 작업을 수행하는 대신 foreach는 인덱스와 루프

  • 사용을 수행합니다. 그런 다음 배열 인덱스 [i] 구문을 사용하여 목록 항목을 처리하고 RemoveAt (i)로 해당 항목을 삭제할 수 있습니다. 항목을 삭제 한 후에 색인을 향상시키는 방법에주의하십시오.
  • 별도의 변수/목록을 사용하여 첫 번째 루프에서 삭제할 항목에 대한 참조를 저장 한 다음이 목록에 대해 두 번째 루프를 실행하여 실제로 후 처리 단계로 삭제를 수행하십시오.
+0

예 .. "마스터"리스트 접근 방식은 제가하고 싶었던 것과 정확히 같습니다 ...하지만 구현 방법을 모르기 때문에 이것을 선택했습니다. 접근.. –