2012-04-04 4 views
1

ich Daten aus einer Tabelle in einer SQLite3 Datenbank in eine Listview lese den Code untenImplement Fortschrittsbalken auf SQLite-Datenbank lesen C#

Im Moment verwende ich die Aufzeichnungen an Begrenzung nur 200 anzuzeigen, wie sie alle Anzeigen dauert viel zu lange. (Einige 30.000 Datensätze)

Ich möchte eine Option geben, um alle Datensätze anzuzeigen und wenn diese Option ausgewählt ist, um jeden Datensatz laden zu können.

Wie gesagt, es dauert eine ganze Weile und ich würde gerne einen Fortschrittsbalken verwenden, um den Status anzuzeigen.

Ich habe noch nie einen Fortschrittsbalken verwendet, also weiß ich nicht, wie sie funktionieren. Wäre es möglich, meinem Code einige zusätzliche Codezeilen hinzuzufügen, um die Verwendung eines Fortschrittsbalkens zu ermöglichen, oder müsste ich einen Code einfügen und einen Hintergrund-Worker verwenden?

private void cmdReadDatabase_Click(object sender, EventArgs e) 
{ 
    listView4.Columns.Add("Row1", 50); 
    listView4.Columns.Add("Row2", 50); 
    listView4.Columns.Add("Row3", 50); 
    listView4.Columns.Add("Row4", 50); 
    listView4.Columns.Add("Row5", 50); 
    listView4.Columns.Add("Row6", 50); 
    listView4.Columns.Add("Row7", 50); 

    try 
    { 
     string connectionPath = Path.Combine(@"C:\", @"temp\"); 

     SQLiteConnectionStringBuilder csb = new SQLiteConnectionStringBuilder(); 
     csb.DataSource = Path.Combine(connectionPath, "database.db"); 

     SQLiteConnection connection = new SQLiteConnection(csb.ConnectionString); 
     connection.Open(); 

     // Query to read the data 
     SQLiteCommand command = connection.CreateCommand(); 
     string query = "SELECT * FROM table_name LIMIT 200 "; 
     command.CommandText = query; 
     command.ExecuteNonQuery(); 

     SQLiteDataAdapter dataAdaptor = new SQLiteDataAdapter(command); 
     DataSet dataset = new DataSet(); 
     dataAdaptor.Fill(dataset, "dataset_name"); 

     // Get the table from the data set 
     DataTable datatable = dataset.Tables["dataset_name"]; 
     listView4.Items.Clear(); 

     // Display items in the ListView control 
     for (int i = 0; i < datatable.Rows.Count; i++) 
     { 
      DataRow datarow = datatable.Rows[i]; 
      if (datarow.RowState != DataRowState.Deleted) 
      { 
       // Define the list items 
       ListViewItem lvi = new ListViewItem(datarow["Row1"].ToString()); 
       lvi.SubItems.Add(datarow["Row2"].ToString()); 
       lvi.SubItems.Add(datarow["Row3"].ToString()); 
       lvi.SubItems.Add(datarow["Row4"].ToString()); 
       lvi.SubItems.Add(datarow["Row5"].ToString()); 
       lvi.SubItems.Add(datarow["Row6"].ToString()); 
       lvi.SubItems.Add(datarow["Row7"].ToString()); 

       // Add the list items to the ListView 
       listView4.Items.Add(lvi); 
      } 
     } 
     connection.Close(); 
    } 
    catch(SQLiteException ex) 
    { 
     MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK); 
    } 
} 
+1

Sie führen Ihre Abfrage zweimal aus, Sie benötigen diesen Zeilenbefehl nicht.ExecuteNonQuery() ;. dataAdaptor.Fill (Dataset, "Dataset_Name"); Will die Abfrage ausführen – Jmyster

+0

@Jmyster Vielen Dank für das zeigen, dass – Daniel

Antwort

1

Id einen Dataview verwenden zu können, so kann ich mir die RowStateFilter mit einer Zählung der Datensätze erhalten muß. Dann durchlaufen Sie die DataView mit einer Foreach anstelle einer For-Anweisung.

 ProgressBar _Bar = new ProgressBar(); 

     DataView _View = new DataView(); 
     _View.Table = datatable; 
     _View.RowStateFilter = DataViewRowState.CurrentRows; 

     _Bar.Minimum = 0; 
     _Bar.Maximum = _View.ToTable().Rows.Count; 

     foreach (DataRow datarow in _View.ToTable().Rows) 
     { 
      // Define the list items  
      ListViewItem lvi = new ListViewItem(datarow["Row1"].ToString()); 
      lvi.SubItems.Add(datarow["Row2"].ToString()); 
      lvi.SubItems.Add(datarow["Row3"].ToString()); 
      lvi.SubItems.Add(datarow["Row4"].ToString()); 
      lvi.SubItems.Add(datarow["Row5"].ToString()); 
      lvi.SubItems.Add(datarow["Row6"].ToString()); 
      lvi.SubItems.Add(datarow["Row7"].ToString()); 

      // Add the list items to the ListView  
      listView4.Items.Add(lvi); 
      _Bar.PerformStep(); 
     } 

Folgende incraments der Fortschrittsbalken:

_Bar.PerformStep(); 

Ohne diesen Code ausgeführt Ich vermute, dass Sie Probleme mit der Progressbar Aktualisierung tatsächlich haben wird, wie Sie denken, es wird. Ihr Prozess wird im Benutzeroberflächen-Thread ausgeführt, sodass die Aktualisierung der Benutzeroberfläche blockiert wird. Vielleicht möchten Sie diesen Prozess in einem anderen Thread ausführen. Das ist ein ganz anderes Thema.

+0

Das funktioniert hervorragend, würden Sie empfehlen, es zu threading? oder es so lassen wie es ist? – Daniel

+0

Wenn es gut geht, dann bist du gut =) Ich bin froh, dass ich helfen kann – Jmyster

1

Für zeigen und die Fortschrittsbalken zu aktualisieren, müssen Sie Maximum und dann Increment Methode setzen, wenn Sie den Fortschritt zeigen mögen. Das würde bedeuten, Code für Inkrement hinzuzufügen, wo Sie wollen. Sie können entweder die Value-Eigenschaft festlegen oder die Increment-Funktion verwenden.

Um den Fortschrittsbalken zu aktualisieren, müssen Sie genauso wie bei anderen Steuerelementen an den übergeordneten Thread des Fortschrittsbalkens delegieren.

wäre ein einfaches Beispiel sein:

progressBar.Maximum = 200; //you have 200 records 
//after retrieving one record, and adding it to list you can do 
//you may have to Invoke it on creating thread if InvokeRequired. 
progressBar.Increment(1); 

Sie viele samples from internet like so

+0

Das ist eigentlich für mich arbeiten, aber wenn ich es unsichtbar machen will bei der Fertigstellung scheint es nie bis zum Ende der Fortschrittsbalken zu bekommen, bevor unsichtbar Würdest du wissen warum das ist? – Daniel

+0

Sie haben also immer noch Probleme? – ata

+0

Nein, alles ist jetzt alles gut, danke für die Hilfe – Daniel