- PR -

C# トグルボタン(Start/Stop)を作成する方法

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-02-21 13:33
ひとつのボタンでStart処理、Stop処理を交互に切り替えることができるようにしたい。

Start処理およびStop処理に時間がかかる場合、Start処理およびStop処理が完了するまでの期間Clickイベントがキューされるのを禁止したい。ボタンのClickイベントを一時的に無効にする良い方法は無いでしょうか?

現状では、Start処理中およびStop処理中のClickイベントが全てキューに入ってしまうので、ボタンが押された回数だけ際限なく処理が実行されてしまいトグルボタンとして正常に機能しません。

bool _hasStart = false;

private void buttonStart_Click(object sender, System.EventArgs e)
{
buttonStart.Enabled = false;
if(_hasStart)
{
// Stop処理中はClickのキューイングを無効にしたい
Stop();
}
else
{
// Start処理中はClickのキューイングを無効にしたい
Start();
}
_hasStart = _hasStart ? false : true;
buttonStart.Enabled = true;
}

追記
VS2005は標準コントロールの機能強化が図られているそうですが、
トグルボタンのような機能は用意されているでしょうか?
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-21 13:39
トグルボタンであれば、チェックボックスのAppearanceプロパティをButtonに設定することで実装できます。

[追記]
VS2005表記を見落としていました。
上記はVS2003でのことなのでおそらく2005でも可能だとは思うのですが・・・。

_________________
うちうせん@SE見習い

[ メッセージ編集済み 編集者: うちうせん 編集日時 2006-02-21 13:41 ]
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-02-21 14:21
コード:

btn.Enabled = true;



の直前に

コード:

Application.DoEvents();



を入れれば元の構造のままならばOKですけど、その間UIが止まることは避けられません(これはつまり「反応しない」とかXPとかだと出るということです)。
なのでEnabled = falseにした後は非同期にしてメッセージループに戻してあげましょう。幸い2005だとだいぶ簡単で、

コード:

btn.Enabled = false;

MethodInvoker invoker = delegate {
  //時間のかかる処理
  System.Threading.Thread.Sleep(5000);
  btn.Invoke(new MethodInvoker(delegate {
    btn.Enabled = true;
  }));
};
invoker.BeginInvoke(delegate(IAsyncResult r) {
  invoker.EndInvoke(r);
}, null);



のように、匿名メソッドを使えば余計なメソッドを作る必要はありませんし。

非同期が不可能であったり、それほど時間のかかる処理でないならば始めに言ったようにApplication.DoEvents()を呼び出してください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-21 22:00
ん〜?なんか、本当に期待した意味でトグルしているのかなぁ???

 単純には、Enabled = false の間に、キューされているメッセージをすべて実行させてやればいいです。
 しかし、例えばストップウォッチの「スタート/ストップ」ボタンを連続的にクリックするようなものですよね。そのままで十分だと思いますけど?
(別スレッド化の処理はすでに実装されていると仮定し、スレッドを分けるのが、そんなに時間を食う処理だとは思わないので)


 実際には、、、

クリックする

処理が実行される→処理が終わる  この間にクリック

ストップボタンになる

またスタートする(本当はストップしたい)


になるとか?

〆 written by Jitta@わんくま同盟 on 2006/02/21
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-02-23 15:12
皆さん、ご回答ありがとうございます。

とりあえずApplication.DoEventsである程度改善できましたが、
完全を求めるなら別の方法を試みる必要があると感じました。

> トグルボタンであれば、チェックボックスのAppearanceプロパティをButtonに設定することで実装できます

が理解できていません。
お手数ですがもう少し解説していただけないでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-23 15:31
引用:

ひろしさんの書き込み (2006-02-23 15:12) より:

> トグルボタンであれば、チェックボックスのAppearanceプロパティをButtonに設定することで実装できます

が理解できていません。
お手数ですがもう少し解説していただけないでしょうか?


リファレンスの CheckBox.Appearance プロパティ にある「解説」を参照してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)