質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

0回答

473閲覧

BackgroundWorkerのIsBusyを、UIコントロールへバインドして制御したい

hillacken

総合スコア359

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

1クリップ

投稿2018/07/17 23:51

#実現したいこと
WindowsFormsアプリケーションについてです。
BackgroundWorkerのIsBusyプロパティをTextBoxのEnabledへバインドしたい。
イベントで切り替えではなくバインドで実現したいです。
(バインドの使い方を覚えるためなので)

#試した内容
BackgroundWorkerを継承したコントロールへINotifyPropertyChangedを実装してみましたが、
BackgroundWorker動作中もTextBoxのEnabledがFalseになったままになってしまいます。

###Form1
Formには、button1とtextBox1とadvancedBackgroundWorker1を貼り付けています。
イメージ説明

Form1_LoadでtextBox1へバインドしています。
button1をクリックするとadvancedBackgroundWorker1を動作させます。
advancedBackgroundWorker1動作中はtextBox1の表示を3,2,1とカウントダウンさせます。(このときに、textBox1のEnabledをTrueにしたい)
advancedBackgroundWorker1のCompletedでtextBox1の表示を0にします。(このときに、textBox1のEnabledをFalseにしたい)

C#

1using System; 2using System.ComponentModel; 3using System.Threading; 4using System.Windows.Forms; 5 6namespace WindowsFormsApp8 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 private void Form1_Load(object sender, EventArgs e) 16 { 17 advancedBackgroundWorker1.WorkerReportsProgress = true; 18 // バインド 19 textBox1.DataBindings.Add(new Binding("Enabled", advancedBackgroundWorker1, "IsBusy")); 20 } 21 22 private void button1_Click(object sender, EventArgs e) 23 { 24 // Run 25 advancedBackgroundWorker1.RunWorkerAsync(); 26 } 27 28 private void advancedBackgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 29 { 30 // カウントダウン 31 advancedBackgroundWorker1.ReportProgress(3); 32 Thread.Sleep(1000); 33 advancedBackgroundWorker1.ReportProgress(2); 34 Thread.Sleep(1000); 35 advancedBackgroundWorker1.ReportProgress(1); 36 Thread.Sleep(1000); 37 } 38 39 private void advancedBackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 40 { 41 textBox1.Text = e.ProgressPercentage.ToString(); 42 } 43 44 private void advancedBackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 45 { 46 textBox1.Text = "0"; 47 } 48 } 49}

###BackgroundWorker継承
BackgroundWorkerを継承しつつ、INotifyPropertyChangedも実装
OnDoWorkとOnRunWorkerCompletedをoverrideして、OnPropertyChangedを呼び出す。

C#

1using System; 2using System.ComponentModel; 3 4namespace WindowsFormsApp8 5{ 6 class AdvancedBackgroundWorker : BackgroundWorker , INotifyPropertyChanged 7 { 8 protected override void OnDoWork(DoWorkEventArgs e) 9 { 10 OnPropertyChanged("IsBusy"); 11 base.OnDoWork(e); 12 } 13 14 protected override void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e) 15 { 16 base.OnRunWorkerCompleted(e); 17 OnPropertyChanged("IsBusy"); 18 } 19 20 public event PropertyChangedEventHandler PropertyChanged; 21 protected virtual void OnPropertyChanged(String name) 22 { 23 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 24 } 25 } 26}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問