- PR -

WindowsForm上の2つのコントロールを相互に連動させる方法

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-12-02 00:19
 ある1つの設定値を更新させたいが、その手段を2つ(あるいは複数)用意したいとします。
例えばWindowsForm上にnumericUpDownコントロールとvScrollBarがあって
ユーザーの好みに応じてどちらのコントロールでも自由に選べるようにしたい
といったケースです。
 どちらのコントロールを選択しても同じ効果が得られることが前提です。
つまり、同じメソッドが1回だけ呼び出されるようにしたいのです。
 設定値は1つですから、片方のコントロールを動かしたら、
もう片方のコントロールは、更新された設定値と整合性を取るために
連動して動きます。
 イベントが発生したら単純にメソッドを呼び出した後にもう片方のコントロールを
動かす処理を記述すると相互に相手を無限に呼び出しあってしまいます。
このような事態を回避しつつ、できれば簡潔に記述したいです。

 良い工夫があれば教えてください
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-12-02 00:31
「現在の値と異なっていれば」という条件節を設ければ済む話だと思いますが?
// 少なくともコントロールの Changed 系イベントは元々そう言う風に実装されてるけど。
ヒトカゲ
会議室デビュー日: 2006/11/29
投稿数: 6
お住まい・勤務地: 大阪
投稿日時: 2006-12-02 10:36
案1)
ベタな方法ですが、フラグを立ててちまちまやります。

コード:

private IsValueChanging = false;

private void Bar1_ValueChanged(...) {
 if (IsValueChanging) {
  IsValueChanging = false;
 } else {
  IsValueChanging = true;
  Bar2.Value = Bar1.Value;
 }
}
// もう片方も同じく


未検証ですけどこんな感じかと思います。


案2)
それぞれのコントロールを継承して新たなクラスを作り、
 public void ChangeValueWithoutEvent(int value)
みたいなメソッドを用意して、内部ではフラグでちまちまやりつつ外からは奇麗に変更出来るようにします。


私なら、大抵は案1、暇とやる気があるときは案2でさらにインターフェースも作ったりするかも知れません(笑)
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-12-02 15:30
ご回答ありがとうございます。
一応、フラグを立てて処理できています。
やはりコントロールの数が増えてくると少し面倒ですね。
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-12-02 20:36
引用:

ひろしさんの書き込み (2006-12-02 00:19) より:
 ある1つの設定値を更新させたいが、その手段を2つ(あるいは複数)用意したいとします。
例えばWindowsForm上にnumericUpDownコントロールとvScrollBarがあって
ユーザーの好みに応じてどちらのコントロールでも自由に選べるようにしたい
といったケースです。
 どちらのコントロールを選択しても同じ効果が得られることが前提です。
つまり、同じメソッドが1回だけ呼び出されるようにしたいのです。
 設定値は1つですから、片方のコントロールを動かしたら、
もう片方のコントロールは、更新された設定値と整合性を取るために
連動して動きます。


ユーザは一つの設定値を更新するのに複数のコントロールで設定が出来てしまうのですか。
ユーザに必ずどれか一つのコントロールだけを選択させれば、コントロール間の整合性は不要になると思いました。
ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 2006-12-02 21:13
この手の処理は、顧客要望が強い割りに、シンプルな実装がし辛いものです。
個々のコントロールのChangeEvent等にに依存すると,フラグの多用になり煩雑になります。
へたするとEvent連鎖でループに陥ることもあります。
更新したい値を持つ変数をクラス仕立てにし, そのクラスに変更が加わったら,関連するコントロールの値を更新するようにする。
そうすれは,コントロールのChangeは独立するので副作用はないかと思います。



_________________
ognac@わんくま同盟
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-12-06 09:16
ご回答ありがとうございます。
Mutexで排他制御の対処をしています。
コントロールが増えると、記述が煩雑になり、苦労しています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-06 10:08
引用:

ひろしさんの書き込み (2006-12-06 09:16) より:

Mutexで排他制御の対処をしています。
コントロールが増えると、記述が煩雑になり、苦労しています。


すみません、逆に質問します。
どうして、ここで Mutex が出てくるのでしょうか?

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

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