【问题标题】:Show a Progress Bar Control devexpress during import data from Excel在从 Excel 导入数据期间显示进度条控件 devexpress
【发布时间】:2017-01-13 23:46:58
【问题描述】:

我有这样的表格导入数据 Excel:

当我选择文件 Excel 然后按进程时,我的表单将显示进程进度条控件 devexpress。

我的代码:

    string constr = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + txtPath.Text + "; Extended Properties =\"Excel 8.0; HDR = Yes;\";";
OleDbConnection con = new OleDbConnection(constr);

OleDbCommand ocmd = new OleDbCommand("SELECT * FROM[Sheet1$]", con);
con.Open();
OleDbDataReader odr = ocmd.ExecuteReader();
string kode = "";
string nama = "";
string satuan = "";
string isAktif = "";
string kodeRek = "";

while (odr.Read())
{
    //get value from excel file column
    kode = odr[0].ToString();
    nama = odr[1].ToString();
    satuan = odr[2].ToString();
    isAktif = odr[3].ToString();
    kodeRek = odr[4].ToString();

    //connection
    if (koneksi_manual.con.State == ConnectionState.Open)
    {
        koneksi_manual.con.Close();
    }
    koneksi_manual.con.Open();

    //insert data excel to oracle database
    OracleCommand cd = new OracleCommand();
    cd.CommandText = @"INSERT INTO RAWMATERIAL(ID_BAHAN, KODE_BAHAN, NAMA_BAHAN, UNIT, ISAKTIF, JENIS_BAHAN, 
                        HARGA_BAHAN, CREATEDBY, CREATEDDATE, MODIFIEDBY, MODIFIEDDATE)
                        (SELECT SQ_BAHAN.NEXTVAL, '" + kode + "', '" + nama + "', '" + satuan + "', '" + isAktif +
                        "', '" + null + "', '" + null + "', '" + Program.UserLogin + "', '" + DateTime.Now +
                        "', '" + Program.UserLogin + "', '" + DateTime.Now +
                        "' FROM DUAL WHERE NOT EXISTS(SELECT * FROM RAWMATERIAL WHERE NAMA_BAHAN='" + nama + "'))";
    cd.Connection = koneksi_manual.con;
    cd.ExecuteReader();
}
odr.Close();

当我将数据从 Excel 插入 Oracle 数据库时,它运行良好。

谁能建议在将数据从 Excel 插入 Oracle 数据库期间如何显示进度条控制过程?

【问题讨论】:

    标签: c# excel winforms devexpress progress-bar


    【解决方案1】:

    BackgroundWorker 让这更容易。

    1) 将BackgroundWorker 控件拖放到设计视图中的表单中。

    2) 注册DoWorkProgressChanged 事件处理程序。

    backgroundWorker1.DoWork += BackgroundWorker1_DoWork;
    backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged;
    

    3) 设置要插入的记录数。

    OleDbCommand ocCount = new OleDbCommand("SELECT COUNT(*) FROM [Sheet1$]", con);
    
    con.Open();
    int count = (int)ocCount.ExecuteScalar();
    
    progressbarcontrol.Maximum = count;
    

    4) 在BackgroundWorker1_DoWork 事件处理程序中移动Insert 循环

    private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // insert loop
    }
    

    5) 将WorkerReportsProgress设置为true,并在循环内调用ReportProgress方法。

    backgroundWorker1.WorkerReportsProgress = true;
    int progress = 0;
    while (odr.Read())
    {
        backgroundWorker1.ReportProgress(++progress);
    }
    

    6) 增加BackgroundWorker1_ProgressChanged 事件处理程序中的值。

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

    另外,您可以在RunWorkerCompleted 事件处理程序中重置进度条。

    【讨论】:

    • 谢谢,...它有效,..我只是添加查询以检查 excel 文件的计数并将其设置为progressbarcontrol.Maximum = count; 并且它有效,...很好,..这非常有用。 .
    【解决方案2】:

    jhmt 给出的答案效果很好。非常好的和干净的解释。只需添加一些我需要的更改以使其适合我,因为我使用的是 devexpress ProgressBarControl。万一有人需要...

    在第 3 步中:

    progressbarcontrol.Maximum = count;
    

    改为:

    progressbarcontrol.Properties.Maximum = count;
    

    并在后面添加了这一行:

    backgroundWorker1.RunWorkerAsync();
    

    在第 6 步中:

    progressbarcontrol.Value = e.ProgressPercentage;
    

    改为:

    progressbarcontrol.EditValue = e.ProgressPercentage;
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2014-07-26
      • 2020-07-10
      • 1970-01-01
      相关资源
      最近更新 更多