2017-04-14 38 views
-1

我只是用WPF中的ProgressBar進行了新的操作。我有一個用戶控制是這樣的:選擇一個Excel文件,然後將所有數據導入到數據表中,最後,所有的數據轉儲到SQL服務器:將操作從用戶控件傳遞到其他窗口中的Worker_DoWork

public partial class Import : UserControl 
{ 

    public Import() 
    { 
     InitializeComponent(); 
    } 

    private void filePickerButton_Click(object sender, RoutedEventArgs e) 
    { 
     // Create the OpenFIleDialog object 
     Microsoft.Win32.OpenFileDialog openPicker = new Microsoft.Win32.OpenFileDialog(); 

     // Add file filters 
     // We are using excel files in this example 
     openPicker.DefaultExt = ".xslt"; 
     openPicker.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm"; 

     // Display the OpenFileDialog by calling ShowDialog method 
     Nullable<bool> result = openPicker.ShowDialog(); 

     // Check to see if we have a result 
     if (result == true) 
     { 
      // Application now has read/write access to the picked file 
      filePathTextBox.Text = openPicker.FileName.ToString(); 
     } 
    } 

    private void btn_Import_Click(object sender, RoutedEventArgs e) 
    { 

     //import all data from excel file to datatable 
     Workbook wb = new Workbook(filePathTextBox.Text); 

     // Accessing the worksheet in the Excel file 
     Worksheet worksheetPro = wb.Worksheets[1]; 

     Worksheet worksheetCat = wb.Worksheets[0]; 

     // Exporting all data by ExportDataTable 
     DataTable dataTablePro = worksheetPro.Cells 
      .ExportDataTable(1, 0, worksheetPro.Cells.Rows.Count - 1, worksheetPro.Cells.Columns.Count, false); 

     DataTable dataTableCat = worksheetCat.Cells 
      .ExportDataTable(1, 0, worksheetCat.Cells.Rows.Count - 1, worksheetCat.Cells.Columns.Count, false); 

     //dump data from datatable to SQL server 
     string connectionString = @"Data Source=DESKTOP-L6OBVA4\SQLEXPRESS;Initial Catalog=QLDB;Integrated Security=True"; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) 
      { 
       //mapping columns of Datatable with the name of DB 
       bulkCopy.ColumnMappings.Add(dataTablePro.Columns[0].ColumnName, "Tên"); 
       bulkCopy.ColumnMappings.Add(dataTablePro.Columns[1].ColumnName, "Giá"); 
       bulkCopy.ColumnMappings.Add(dataTablePro.Columns[2].ColumnName, "Số Lượng"); 
       bulkCopy.ColumnMappings.Add(dataTablePro.Columns[3].ColumnName, "Miêu Tả"); 

       //set the destination table name in DB will be affected 
       bulkCopy.DestinationTableName = "dbo.Products"; 

       try 
       { 
        //coppy all rows from nominated datatable and dump it to DB 
        bulkCopy.WriteToServer(dataTablePro); 
        dataTablePro.Clear(); 
        using (SqlBulkCopy bulkCopyCat = new SqlBulkCopy(connection)) 
        { 
         bulkCopyCat.ColumnMappings.Add(dataTableCat.Columns[0].ColumnName, "Loại"); 
         bulkCopyCat.DestinationTableName = "dbo.Categories"; 
         bulkCopyCat.WriteToServer(dataTableCat); 
         dataTableCat.Clear(); 
         MessageBox.Show("Success!!!"); 
        }       
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
      } 
     } 

    } 
} 

該用戶控制的目的。我需要爲從數據錶轉儲到SQL服務器的操作創建一個處理欄,因爲我認爲這需要很長時間。所以,接下來的事情,我創建一個進程欄窗口:

public partial class ProgressBar : Window 
{ 
    public ProgressBar() 
    { 
     InitializeComponent(); 
    } 

    private void Window_ContentRendered(object sender, EventArgs e) 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += worker_DoWork; 
     worker.ProgressChanged += worker_ProgressChanged; 

     worker.RunWorkerAsync(); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      (sender as BackgroundWorker).ReportProgress(i); 
      //do my operation here 
     } 
    } 

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     pbStatus.Value = e.ProgressPercentage; 
    } 
} 

,你可以在上面看到的代碼段,我有一個名爲方法:

worker_DoWork()

它是我計劃把我的行動。和過去的事情,我想,因爲我覺得這些線需要時間來處理採取從用戶控制這些行代碼,然後把它放到worker_DoWork():

try 
       { 
        //coppy all rows from nominated datatable and dump it to DB 
        bulkCopy.WriteToServer(dataTablePro); 
        dataTablePro.Clear(); 
        using (SqlBulkCopy bulkCopyCat = new SqlBulkCopy(connection)) 
        { 
         bulkCopyCat.ColumnMappings.Add(dataTableCat.Columns[0].ColumnName, "Loại"); 
         bulkCopyCat.DestinationTableName = "dbo.Categories"; 
         bulkCopyCat.WriteToServer(dataTableCat); 
         dataTableCat.Clear(); 
         MessageBox.Show("Success!!!"); 
        }       
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 

我應該做的就是它?我聽說了代表和事件可以給我一個選擇,但我無法自己找到它。謝謝!

+0

不要從窗口繼承ProgressBar。如果您必須繼承將其設爲用戶控件並將其放在主窗口中,以便通過更改Visibility屬性使其與其餘部分重疊。然後將該可見性屬性綁定到某個靜態可見性屬性,您將在單擊按鈕時更改該靜態可見性屬性。這當然是,如果你想要一個進度欄 –

+0

@MatijaK的例子。我知道了。謝謝。 –

回答

0

如果您不關心進度對話框的多個實例。然後嘗試這樣的事:

Import.xaml:

<Grid> 
     <Button x:Name="filePicker" Content="ClickMe" Click="filePicker_Click" DockPanel.Dock="Top"/> 
     <ProgressBar x:Name="progressBar" Minimum="0" Maximum="100" Value="75" DockPanel.Dock="Top" Visibility="Collapsed" /> 
    </Grid> 

Import.xaml.cs

private void filePicker_Click(object sender, RoutedEventArgs e) 
    { 
     progressBar.Visibility = Visibility.Visible; 

     // here you call your batch code 
     var task = new Task(() => Thread.Sleep(3000)); 
     // after task is done hide progress dialog 
     task.ContinueWith(x => Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => this.progressBar.Visibility = Visibility.Collapsed))); 
     task.Start(); 
    } 

(我沒有更新狀態打擾它。總是75%)。

相關問題