1

以下のコードを使用して、SQLite3 データベースのテーブルから ListView にデータを読み込んでいます

現時点では、すべてのレコードを表示するには時間がかかりすぎるため、レコードを 200 のみ表示するように制限しています。(約30,000レコード)

すべてのレコードを表示するオプションを提供したいと思います。そのオプションを選択すると、すべてのレコードをロードできるようになります。

私が言ったように、かなりの時間がかかるので、進行状況バーを使用してステータスを表示したいと思います。

これまでプログレス バーを使用したことがないため、どのように機能するのかわかりません。プログレス バーを使用できるようにするには、コードに数行のコードを追加する必要がありますか?それともスレッド化してバックグラウンド ワーカーを使用する必要がありますか?

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);
    }
}
4

2 に答える 2

1

進行状況バーを表示および更新するには、進行状況を表示したいときに設定MaximumしてからIncrementメソッドを実行する必要があります。これは、必要な場所にインクリメントのコードを追加することを意味します。Valueプロパティを設定するか、Increment関数を使用できます。

プログレス バーを更新するには、他のコントロールの場合と同様に、プログレス バーの親スレッドに委任する必要があります。

簡単な例は次のとおりです。

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);

このようにインターネットからたくさんのサンプルを入手できます

于 2012-04-04T17:34:16.640 に答える
1

RowStateFilter を使用して必要なレコードの数を取得できるように、DataView を使用します。次に、for ステートメントの代わりに foreach を使用して DataView を反復処理します。

        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();
        }

以下はプログレスバーをインクリメントします:

_Bar.PerformStep();

このコードを実行しないと、プログレスバーが実際に更新されると思うように問題が発生するのではないかと思います。プロセスは UI スレッドで実行されているため、UI の更新がブロックされます。このプロセスを別のスレッドで実行することを検討することをお勧めします。それはまったく別のトピックです。

于 2012-04-04T17:57:05.220 に答える