2013-08-09 1 views
0

Загрузка больших объемов данных с использованием ListViewItem BackgroundWorkerЗагрузка данных большого ListViewItem с помощью BackgroundWorker

У меня возникли проблемы с загрузкой больших объемов данных, когда я собирался открыть форму. Так что я сделал то, что я внедрил компонент BackgroundWorker в свою форму, и так выглядит мой код.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int x = 1; x <= 100; x++) 
    { 
     loadDataByAll(); //Loads All Data to ListView 
     backgroundWorker1.RunWorkerAsync(); 
     backgroundWorker1.ReportProgress(x); 
    } 
} 

процесса изменений Код события

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 

Для loadDataByAll() Функция

private void loadDataByAll() 
{ 
    try 
    { 
     lviewGuard.Items.Clear(); 
     con.ConnectionString = dbcon.getConnectionString(); 
     con.Open(); 
     String query = "SELECT guardid AS a, g_firstname AS b, g_midname AS c, g_lastname AS d, g_age AS e, g_gender AS f, g_address AS g, g_contactno AS h, g_licno AS i, g_lic_until AS j, g_assigned_client AS k, g_schedule_from AS l, g_schedule_to AS m, app_no AS n"; 
     query += " FROM guards"; 
     query += " WHERE resigned = '0' ORDER BY app_no DESC"; 
     OleDbCommand cmd = new OleDbCommand(query, con); 
     cmd.ExecuteScalar(); 
     OleDbDataReader rdr = cmd.ExecuteReader(); 
     while (rdr.Read()) 
     { 
      lviewGuard.BeginUpdate(); 
      ListViewItem lv = new ListViewItem(rdr["a"].ToString()); 
      lv.SubItems.Add(rdr["b"].ToString()); 
      lv.SubItems.Add(rdr["c"].ToString()); 
      lv.SubItems.Add(rdr["d"].ToString()); 
      lv.SubItems.Add(rdr["e"].ToString()); 
      lv.SubItems.Add(rdr["f"].ToString()); 
      lv.SubItems.Add(rdr["g"].ToString()); 
      lv.SubItems.Add(rdr["h"].ToString()); 
      lv.SubItems.Add(rdr["i"].ToString()); 
      lv.SubItems.Add(rdr["j"].ToString()); 
      lv.SubItems.Add(rdr["k"].ToString()); 
      lv.SubItems.Add(rdr["l"].ToString()); 
      lv.SubItems.Add(rdr["m"].ToString()); 
      lv.SubItems.Add(rdr["n"].ToString()); 
      lviewGuard.Items.Add(lv); 
      lviewGuard.EndUpdate(); 
      }    
      con.Close(); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("MDB Database is not Present", "Microsoft Access Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Application.ExitThread(); 
     } 
} 

И, наконец, My Button Реализация

private void btnGo7_Click(object sender, EventArgs e) 
{ 
    for (int x = 1; x <= 100; x++) 
    { 
     btnGo7.Text = "Running"; 
     btnGo7.Enabled = false; 
    } 
    btnGo7.Text = "Go"; 
    btnGo7.Enabled = true; 
    progressBar1.Value = 0; 
    tabControl1.Visible = false; 
} 

Извините тратить свое время прочитав этот код. Я действительно полный noob об этом многопоточности и фоновой работе.

+0

Итак, в чем проблема то? – zey

+0

@ Zey Проблема в том, что когда я нажимаю кнопку, я не могу определить, работает ли фоновой рабочий с loadDataByAll(). – Bon

ответ

1

Я советую загрузить данные в список и поместить список в виртуальный режим.

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx

Это бесполезно, чтобы создать ListViewItem для каждой строки. Попробуйте
уменьшить выбранные строки. (никто не читает 1 mil listviewitems). Настроить ListView в виртуальном режиме ..

Если вы хотите, чтобы наклеить на версии:

Если loadDataByAll() работает на потоке, не трогайте элемент списка!

Я хотел бы сделать что-то вроде этого: (не прибить меня опечатка, а не тестирование)

private void loadDataByAll() 
{ 
try 
{ 
    // lviewGuard.Items.Clear(); 
    con.ConnectionString = dbcon.getConnectionString(); 
    con.Open(); 
    String query = "SELECT guardid AS a, g_firstname AS b, g_midname AS c, g_lastname AS d, g_age AS e, g_gender AS f, g_address AS g, g_contactno AS h, g_licno AS i, g_lic_until AS j, g_assigned_client AS k, g_schedule_from AS l, g_schedule_to AS m, app_no AS n"; 
    query += " FROM guards"; 
    query += " WHERE resigned = '0' ORDER BY app_no DESC"; 
    OleDbCommand cmd = new OleDbCommand(query, con); 
    cmd.ExecuteScalar(); 
    OleDbDataReader rdr = cmd.ExecuteReader(); 
    List<obj> data = new List<obj>(); 
    while (rdr.Read()) 
    { 
     data.Add(new obj 
     { 
      a = rdr["a"], 
      b = rdr["b"] 
     }); 
     }    
     con.Close(); 


     this.Invoke(new Action(delegate { UpdateListview(data); })); 

    } 
    catch (Exception) 
    { 
     MessageBox.Show("MDB Database is not Present", "Microsoft Access Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     Application.ExitThread(); 
    } 

}

public void UpdateListview(List<obj> data) 
{ 
    lviewGuard.BeginUpdate(); 
    lviewGuard.Items.Clear(); 
    foreach(obj o in data) 
    { 
     ListViewItem lv = new ListViewItem(rdr["a"].ToString()); 
     lv.SubItems.Add(o.b.ToString()); 
     lv.SubItems.Add(o.c.ToString()); 

     lviewGuard.Items.Add(lv); 
    } 

    lviewGuard.EndUpdate(); 
}