単純なWindowsフォームアプリケーション(WPFではない)があり、2つのコントロールがあります。
- TrackBar
- NumericUpDown
それらの間に何らかのバインディングを作成したいので、一方の値が変更された場合、もう一方のコントロールは同じ値を表示するように更新されます。
これは可能ですか?もしそうなら、どうすればそれを行うことができますか?
ありがとう。
単純なWindowsフォームアプリケーション(WPFではない)があり、2つのコントロールがあります。
それらの間に何らかのバインディングを作成したいので、一方の値が変更された場合、もう一方のコントロールは同じ値を表示するように更新されます。
これは可能ですか?もしそうなら、どうすればそれを行うことができますか?
ありがとう。
もちろん、それは可能です。2 つのコントロール間の接続を自動化する方法がわからないので、自分でコードを作成する必要があります。しかし、心配しないでください。難しいことではありません。
まず、値が変更されたときに各コントロールによって発生するイベントにハンドラーをアタッチする必要があります。論理的には、どちらもこのイベントを同じように制御します: ValueChanged
. 次に、各イベント ハンドラー メソッドで、他のコントロールの値を最初のコントロールの新しい値にプログラムで設定できます。例えば:
void myNumericUpDown_ValueChanged(object sender, EventArgs e)
{
// Sync up the trackbar with the value just entered in the spinbox
myTrackBar.Value = Convert.ToInt32(myNumericUpDown.Value);
}
void myTrackBar_ValueChanged(object sender, EventArgs e)
{
// Sync up the spinbox with the value just set on the trackbar
myNumericUpDown.Value = myTrackBar.Value;
}
これが正しく機能するためには、コントロールの範囲 (最大値と最小値) が同じであることを確認するか、上記のコードにエラー チェックを追加する必要があります。
コントロールの 1 つが値の変更を引き起こすたびに、その変更値ハンドラーが他のコントロールの変更を引き起こし、その変更ハンドラーが実行されます。ただし、今回は値が同じであるため、変更ハンドラーが再度起動することはなく、潜在的な無限ループが終了します。
ハンドラーを 1 つだけ起動させる方法はありますが、おそらく価値はありません。
トラックバー コントロールの場合、スクロール イベントを使用すると、ユーザーが実際にトラックバー コントロールを動かしたときにのみスクロール ハンドラーが起動することを指摘しておきます。コード (他のコントロールの変更ハンドラー) の結果として移動する場合、スクロール イベントはトリガーされません。したがって、値変更イベントの代わりにそれを使用すると、その方向に役立ちます。
反対方向では少し難しいです。数値の上下の派生クラスを作成し、UpButton メソッドと DownButton メソッドをオーバーライドして、コントロール自体の上矢印と下矢印のクリックをキャプチャする必要があります。