【问题标题】:Implement progress bar on SQLite database read C#在 SQLite 数据库读取 C# 上实现进度条
【发布时间】:2012-04-04 17:14:19
【问题描述】:

我正在使用下面的代码将 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);
    }
}

【问题讨论】:

  • 您正在运行您的查询两次,您不需要此行 command.ExecuteNonQuery();。 dataAdaptor.Fill(dataset, "dataset_name");将运行查询
  • @Jmyster 感谢您指出这一点

标签: c# visual-studio-2010 sqlite progress-bar


【解决方案1】:

我使用 DataView,因此我可以使用 RowStateFilter 获取我需要的记录计数。然后使用 foreach 而不是 for 语句遍历 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 更新。您可能想研究在另一个线程上运行此进程。那完全是另一个话题了。

【讨论】:

  • 这很好用,你会推荐线程吗?还是保持原样?
【解决方案2】:

为了显示和更新进度条,你必须设置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);

你可以得到很多samples from internet like so

【讨论】:

  • 这实际上对我有用,但如果我想让它在完成时不可见,它似乎永远不会在变得不可见之前到达进度条的最后你知道这是为什么吗?
  • 你还有问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2010-11-04
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多