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

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

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

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Q&A

2回答

2470閲覧

C#のNumericUpDown Part2

Yoshikun_0945

総合スコア224

C#

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

0グッド

0クリップ

投稿2016/11/29 05:27

C#でNumericUpDownを使用しています。

#実現したいこと
フォーム上にのNumericUpDown1とNumericUpDown2を用意します。
NumericUpDown1は、小数点第2位まで使用した小数数値で指定
NumericUpDown2は、NumericUpDown1の指定値×1000した値を指定
とします。
NumericUpDown1または、2のどちらかを増減したときに、もう片方の値も自動で増減するようにすることは出来ますか?

##各NumericUpDownの指定値
NumericUpDown1は0.1~2.0間で、0.05ずつ増減
NumericUpDown2は、NumericUpDown1を×1000した値
つまり、100~2000の間で、50ずつ増減
です。

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

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

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

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

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

guest

回答2

0

イベントを直接ハンドリングして自分で同期をとる素朴なものからバインディングを使うようなよりエレガント(?)なものまでいくつか方法はあると思います。とりあえず最も素朴なものならイベント発生時にそれがスタックオーバーフローをおこさないように配慮すれば実装できると思います。NumericUpDownの「値が変化したときのイベント」「値を設定する方法」さえ分かっていれば「値が変化したときのイベントハンドラー」を以下のように書けます。日本語で書いてある部分は適切に解釈してください。リファレンスを見ればわかると思いますので。

C#

1bool changingNumericUpDowns = false;//スタックオーバーフローを防ぐためのフラグ 2 3void NumericUpDown1_値が変わった(...) { 4 var currentValue = NumericUpDown1の現在値; 5 if (!changingNumericUpDown) { 6 try { 7 changingNumericUpDown = true; 8 NumericUpDown2.現在の値 = currentValue * 1000; 9 } finally { 10 changingNumericUpDown = false; 11 } 12 } 13} 14 15void NumericUpDown2_値が変わった(...) { 16 //同様 17}

余談ですが、0.05刻みの方は誤差が出ないように工夫することが必要だと思います。

投稿2016/11/29 06:37

KSwordOfHaste

総合スコア18394

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

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

0

ValueChanged イベントで、変更されなかった側の Value を設定してやればいいのですが、下手にやると ValueChanged イベントが連鎖するので、そこだけは気を付ける必要があります。

Csharp

1private void numericUpDown1_ValueChanged(object sender, EventArgs e) { 2 NumericUpDown target = null; 3 Decimal value; 4 if ((sender as NumericUpDown).Name == "numericUpDown1") { 5 value = this.numericUpDown1.Value * 1000m; 6 target = this.numericUpDown2; 7 } else { 8 value = this.numericUpDown2.Value / 1000m; 9 target = this.numericUpDown1; 10 } 11 12 if (target != null && target.Value != value) { 13 target.Value = value; 14 } 15}

このイベントハンドラを numericUpDown1, numericUpDown2 の双方の ValueChanged イベントに設定してやれば動きます。

投稿2016/11/29 06:32

編集2016/11/29 06:37
tacsheaven

総合スコア13703

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

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

Yoshikun_0945

2016/11/29 10:58

最小値と最大値の範囲外になってしまいます
tacsheaven

2016/11/29 11:46

きちんとそれぞれの Minimum, Maximum を指定してあれば、問題ないはずですが。 (実際、試してみた分には問題ありませんでしたし) どちらの NumericUpDown で数値変化が起きたかを判定している、 if ((sender as NumericUpDown).Name == "numericUpDown1") の部分を環境に合わせてないとか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問