2010-12-04 2 views
0

Я написал этот код, чтобы читать тысячи строк из файлов Excel и загружать их в DataGridView.Проблема с BackgroundWorker

Но проблема, с которой я столкнулся, независимо от того, какой файл я загружаю, DataGridView показывает строки только из первого файла, а _list никогда не очищается.

public class MyForm : Form 
{ 
    private List<Student> _list = null; 

    private void LoadFile_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      if (_list != null) 
      { 
       _list.Clear(); 
      } 

      openFileDialog1.ShowDialog(); 

      _connStr = MakeConnectionString.GetConnectionString(openFileDialog1.FileName); 

      if (!string.IsNullOrEmpty(_connStr)) 
      { 
       backgroundWorker1.RunWorkerAsync(); 
      } 
     } 
     catch 
     { 
      MessageBox.Show("Application is busy with the first task!", "Busy...", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
     } 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     if (backgroundWorker1.CancellationPending) 
     { 
      e.Cancel = true; 
      return; 
     } 

     IDataReader read = StudentDA.GetReader(_connStr); 
     List<Student> localList = null; 

     if (_list != null) 
     { 
      _list.Clear(); 
     } 
     _list = StudentMapper.GetStudents(read); 


     localList = new List<Student>(_list); 

     dataGridView1.Invoke(new MethodInvoker(delegate 
     { 
      dataGridView1.Rows.Clear(); 
     })); 

     foreach (Student std in localList) 
     { 
      dataGridView1.Invoke(new MethodInvoker(delegate 
      { 
       dataGridView1.Rows.Add(std.SerialNo, std.RollNo); 
      })); 
     } 
    } 
} 
+0

Не имеет значения, очистите ли вы список, поскольку: вы не привязываетесь к данным и b: переназначить список в следующей строке; Я все еще смотрю, хотя ... – 2010-12-04 12:17:06

+0

Очистить свой _list в рабочем рабочем завершенном обработчике событий – TalentTuner 2010-12-04 12:20:52

ответ

1

Попробуйте создать новый объект BackgroundWorker каждый раз, вы загружаете новые данные.

вы не чейнинг объекта _connection

static _connection = null; 

if(_connection == null) 
    { 

    } 

это будет работать только работает на 1-й раз и в следующий раз, когда вы изменяете файл это соединение не получает изменилось.

1

Вы уверены, что где-то не исключение? Попробуйте обработать событие завершения и проверить исключение, открытое для объекта event-arg

Также; цикл с одним Invoke на каждом шаге, вероятно, будет замедлять работу; возможно, сделать выборку данных на заднем плане, а затем сделать весь clear/add-loop в одном Invoke. Если это слишком много, по крайней мере, выкладывайте его в маленькие наборы; или рассмотреть виртуальный режим (который намного эффективнее для больших объемов данных).

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