簡體   English   中英

Winforms中的后台工作程序加載屏幕

[英]Background Worker loading screen in Winforms

我有一個可以登錄的表單,可能需要一段時間才能將數據加載到表單中。 因此,我想在加載表單時使用進度條創建一個單獨的表單(loadScreen.cs)。 我在loadScreen.cs表單中嘗試了此操作:

 private void Form1_Load(object sender, EventArgs e)
 {
   worker = new BackgroundWorker();
   worker.WorkerReportsProgress = true;
   worker.WorkerSupportsCancellation = true;

   worker.DoWork += new DoWorkEventHandler(worker_DoWork);
   worker.ProgressChanged +=
          new ProgressChangedEventHandler(worker_ProgressChanged);
   worker.RunWorkerCompleted +=
         new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
 }



 void worker_DoWork(object sender, DoWorkEventArgs e)
 {
   int percentFinished = (int)e.Argument;
   while (!worker.CancellationPending && percentFinished < 100)
 {
   percentFinished++;
   worker.ReportProgress(percentFinished);
   System.Threading.Thread.Sleep(50);
 }
 e.Result = percentFinished;
 }


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


 void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
  this.Close();
  }

我已經讀過worker_DoWork方法應該具有需要較長時間加載的代碼。 我不知道如何處理,因為我的按鈕在Form1中。 單擊它,然后我去另一個課

  private void signIn_Click(object sender, EventArgs e)
    {
        var logIn = new LogIn(this);
        logIn.checkUserInput(this);
    }

然后執行加載某些內容的操作。 如何連接一切? 我需要幫助!

實際上,我正在為這種事情創建通用對話。 還沒有及時准備好對您有用,但是我建議您遵循類似的思路。 創建您的“正在加載”對話框,以便它接受委托並在DoWork事件處理程序中調用它。 然后,主窗體可以包含一個完成工作的方法,您可以將該方法的委托傳遞給對話框。 我將發布一個非常基本的示例。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private DataTable table;

    private void button1_Click(object sender, EventArgs e)
    {
        var work = new Action(GetData);

        using (var f2 = new Form2(work))
        {
            f2.ShowDialog();
            this.dataGridView1.DataSource = this.table;
        }
    }

    private void GetData()
    {
        this.table = new DataTable();

        using (var adapter = new SqlDataAdapter("SELECT * FROM MyTable", "connectionstring here"))
        {
            adapter.Fill(table);
        }
    }
}


public partial class Form2 : Form
{
    private Action work;

    public Form2(Action work)
    {
        InitializeComponent();

        this.work = work;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        this.backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        this.work();
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.DialogResult = DialogResult.OK;
    }
}

請注意,使用數據適配器時沒有真正的方法來衡量進度,因此在這種情況下,您只能真正顯示選取框進度條。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM