2015-11-20 7 views
0

Я занимаюсь разработкой простого приложения Windows Forms в C#Form1_Load не называется (попытка иметь BackgroundWorker)

Я хочу, чтобы показать GUI, а затем запустить некоторые задачи в фоновом режиме. Я хотел бы показать прогресс этих задач, используя текстовую метку в формах.

Program.cs довольно проста:

static void Main() 
    {  
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     Form mainForm = (new Form1()); 

     Application.Run(mainForm); 
    } 

Для ярлыке я обвязку

partial class Form1 : INotifyPropertyChanged 
{ 
    public string Title 
    { 
     get { return _title; } 
     set 
     { 
      _title = value; 
      if(PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("Title")); 
      } 
     } 


private void InitializeComponent() 
    { 
     this.label1 = new System.Windows.Forms.Label(); 
     this.SuspendLayout(); 
     // 
     // label1 
     // 
     this.label1.AutoSize = true; 
     this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this, "Title", true)); 
     this.label1.Location = new System.Drawing.Point(12, 9); 
     this.label1.Name = "label1"; 
     this.label1.Size = new System.Drawing.Size(46, 17); 
     this.label1.TabIndex = 0; 
     this.label1.Text = "label1"; 
     // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(763, 255); 
     this.Controls.Add(this.label1); 
     this.Name = "Form1"; 
     this.Text = "Form1"; 
     this.ResumeLayout(false); 
     this.PerformLayout(); 


    } 
private string _title = "xxgg"; 
    private System.Windows.Forms.Label label1; 

    public event PropertyChangedEventHandler PropertyChanged; 

И тогда я хотел бы запустить фоновый рабочий, но по какой-то причине метод Form1_Load не выполняется.

private void Form1_Load(object sender, System.EventArgs e) 
    { 
     System.Console.WriteLine("Form loaded"); 

     var bw = new BackgroundWorker(); 
     bw.DoWork += bw_DoWork; 
     bw.RunWorkerAsync(); //Start the worker 
    } 

void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     InfoText it = new InfoText(); 
     FileMover fm = new FileMover(it); 

     foreach(string path in sourcePaths) 
     { 
      fm.MoveFrom(path); 
      this.Title = it.text; 
     } 
    } 

Как вы можете видеть, я хочу обновить заголовок во время работы фонового работника.

В чем причина того, что моя Form1_Load не называется? Спасибо

Edit: Я добавил код BackgroundWorker в классе Form1, как это:

public partial class Form1 : Form 
{ 
    BackgroundWorker bw; 

    public Form1() 
    { 
     InitializeComponent();   

     it = new InfoText(); 

     bw = new BackgroundWorker(); 
     bw.DoWork += bw_DoWork; 
     bw.WorkerReportsProgress = true; 
     bw.ProgressChanged += Bw_ProgressChanged; 
     bw.RunWorkerCompleted += Bw_RunWorkerCompleted; 
     bw.RunWorkerAsync(); //Start the worker 
    } 

    private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     Console.WriteLine("done"); 

     this.Title = it.text; 
    } 

    private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     Console.WriteLine("progress changed " + e.ProgressPercentage); 

     this.Title = it.text; 
    } 

    void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     FileMover fm = new FileMover(it); 

     foreach(string path in sourcePaths) 
     { 
      fm.MoveFrom(path); 
      bw.ReportProgress(1); 
     } 
    } 
} 

Теперь он делает именно то, что я хотел.

+0

Потому что он не зарегистрирован в форме в любом месте ... – fabrosell

+2

Вместо этого запишите его в OnLoad. Не обращайтесь к элементам GUI из метода DoWork. – LarsTech

+0

My Form1_Load теперь вызывается благодаря @fabrosell, но Title не обновляется. Что вы имеете в виду, написав его в OnLoad? – rluks

ответ

0

Добавить

this.Load += new System.EventHandler(Form1_Load); 

Внутри InitializeComponent ... или конструктор класса.

Я хотел бы добавить его через GUI-дизайнер, это безопаснее и проще.

+1

'new System.EventHandler' не требуется. Компилятор сделает это автоматически –

+0

Полезно знать. Скопировано точно с vs 2013. – fabrosell

+1

Рекомендовать пользователям SO-пользователям редактировать InitializeComponent() вручную - очень плохой совет. –