2014-12-27 2 views
1

У меня есть приложение, которое должно содержать элементы в больших количествах и непрерывно во ListViews управления:System.argumentoutofrangeexception в то время ВЫЗОВ Listviewitems используя итераторы

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     deg_loadfile load = new deg_loadfile(loadfile); 
     load.BeginInvoke(new AsyncCallback(loadcallback),null); 
    } 

    void countfile() { 

     int listcount = listView1.Items.Count;   
     for (int x = 0; x < listcount; x++) { 

      listView1.BeginInvoke((MethodInvoker)delegate { 
       listView1.Items[x].SubItems[1].Text = "ok"; 
       listView1.Items[x].SubItems[2].Text = "ok"; 
       listView1.Items[x].SubItems[3].Text = "done"; 
      },x); 

     } 

    } 
    void countcallback(IAsyncResult ae) { 
     MessageBox.Show("count finished"); 

    } 
    delegate void deg_count(); 

    void loadcallback(IAsyncResult ae) { 
     MessageBox.Show("finished"); 

    } 
    delegate void deg_loadfile(); 
    void loadfile() { 

     string file = File.ReadAllText("hughlist.txt"); 
     string[] files = Regex.Split(file,"\n"); 

     foreach (string str in files) { 
      listView1.BeginInvoke((MethodInvoker)delegate { 
       ListViewItem item = new ListViewItem(str); 
       item.SubItems.Add(""); 
       item.SubItems.Add(""); 
       item.SubItems.Add(""); 
       listView1.Items.Add(item);     
      },str);   
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     deg_count count = new deg_count(countfile); 
     count.BeginInvoke(new AsyncCallback(countcallback),null); 

    } 

Код выше броски system.argumentoutofrangeexception (см рисунок ниже)

ссылка на изображение: http://i.stack.imgur.com/WJ7sA.png

итерация превысил условия, которые я дал, почему это произошло (примечание: в моем случае, я должен использовать «для» вместо «Еогеасп» или другое перечисление)?

ТНХ

UPDATE: ТНХ к @saruman для ответа (ключевое слово «доступ к модифицированному закрытия»), я уже обновил код, как показано ниже

for (int x = 0; x < listcount; x++) { 
      var x1=x; 
      listView1.BeginInvoke((MethodInvoker)delegate 
      { 
       listView1.Items[x1].SubItems[1].Text = "ok"; 
       listView1.Items[x1].SubItems[2].Text = "ok"; 
       listView1.Items[x1].SubItems[3].Text = "done"; 
      }, x1); } 
+0

Выполняет ли цикл хотя бы один раз? –

+0

@ l19 да, он выполняется один раз, а затем генерирует исключение – mysticcode

ответ

1

Посмотрите доступа для модифицированного закрытия

Попробуйте

var listcount = listView1.Items.Count; 
for (var x = 0; x < listcount; x++) 
{ 
    var x1 = x; 
    listView1.BeginInvoke((MethodInvoker)delegate 
    { 
     listView1.Items[x1].SubItems[1].Text = "ok"; 
     listView1.Items[x1].SubItems[2].Text = "ok"; 
     listView1.Items[x1].SubItems[3].Text = "done"; 
    }); 
} 
+0

в моем случае, я не могу использовать «foreach», мой код приложения только вызывает цикл, а затем переходим к пределу. – mysticcode

+0

@mysticgirltk обновленный ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^