- PR -

ScrollBarのValueChangeを事前にキャッチ

投稿者投稿内容
さくら
常連さん
会議室デビュー日: 2005/09/12
投稿数: 31
投稿日時: 2005-09-12 10:48
WinXP/VB.Netで開発しています。

ScrollBarを動かされたときに画面上の入力値のチェックを行い、OKだったら
画面を動かし、ダメだったらエラーメッセージを出してスクロールをしない、
ということをしたいと思っています。
この入力値チェックをValueChangedイベントでチェックしようと思ったのですが、
イベントに飛んできたときにはすでにスクロールバーの値が変わった後なので、
「エラーメッセージを出して画面を動かさない」というところはできていても
肝心のスクロールバーがすでにスクロールしてしまっています。

一つの案として、スクロールバーの位置を保持するメンバ(SCVal)をクラスに追加して
チェックがOKだったら画面を動かしてSCVal = ScrollBarの新しいValueにセットし、
NGだったら画面を動かさず、動いてしまったスクロールバーは
ScrollBar.Value = SCVal とかして巻き戻しさせる(無理やりですが)、というのを
思いついたのですがメンバ変数は極力使わないというプロジェクトの方針があり、
却下されてしまいました。

ValueChanged(事後)ではなく、Valueが動こうとするタイミング(BeforeValueChange?)
でとれるイベントがあればよいのですが、そういうのもないみたいで困っています。

どなたか良い回避策をご存知でしたら教えてください。
お願いします。
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-12 11:05
お世話になります。

Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll
  e.NewValue = Me.VScrollBar1.Value
End Sub

とかでどうでしょうか。

# ただ、個人的にはスクロールバーを動かしたときに入力チェックって
# ユーザビリティ的観点で見ると、どうかなぁ…という気もします…
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2005-09-12 11:06
南部です。

Scrollイベントかな。
さくら
常連さん
会議室デビュー日: 2005/09/12
投稿数: 31
投稿日時: 2005-09-12 12:58
なおこ(・∀・)さん、nanbuさん、お返事どうもありがとうございます。
ご指摘のとおり、Scrollイベントで拾うことができました。

Scrollイベントの中で
Private Sub VScrollBar1_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll
If Not CheckData() Then
e.NewValue = VScrollBar1.Value
End If
End Sub
としておいて、ValueChangedイベントの中で画面の移動のみを制御することで
Scrollイベントでチェック→うまくいったらValueChangedイベントで画面を移動
という、思っていたとおりの制御ができるようになりました。

#確かにわたしもスクロールバーを動かしたときにチェックというのは???と
#思ったのですが。
#既存システムがそうなっているということなので…

どうもありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-09-12 21:26
 入力コントロールの Validating イベントで処理する、に一票。これだと入力コントロールからフォーカスが離れるときにチェックされます。

…まさかとは思いますが、スクロールバーの移動でチェック、ボタンをクリックしようとするときにチェックなど、チェックする箇所をたくさん作っていませんよね?

_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-13 09:20
引用:

Jittaさんの書き込み (2005-09-12 21:26) より:

…まさかとは思いますが、スクロールバーの移動でチェック、ボタンをクリックしようとするときにチェックなど、チェックする箇所をたくさん作っていませんよね?


スクロール バーでのチェックはしていると書いてありますよ (w

# もちろん、アクセシビリティ、ユーザビリティ的にはよろしくないです。

で、当然スクロール バーを移動せずに、[完了] なんて普通にあるので、
最終チェックしている箇所はあるでしょう。


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さくら
常連さん
会議室デビュー日: 2005/09/12
投稿数: 31
投稿日時: 2005-09-13 11:19
引用:

Jittaさんの書き込み (2005-09-12 21:26) より:
…まさかとは思いますが、スクロールバーの移動でチェック、ボタンをクリックしようとするときにチェックなど、チェックする箇所をたくさん作っていませんよね?



…してます
基本的にあまり「登録」を意識しない仕様なので、どんどん入力すると勝手にどんどん
Commitされます。
よって、入力エリアを出た時点でのチェックとかじゃんぬねっとさんのおっしゃる
終了時のチェック(ダメだったら終了させない)もしています。

うぅ。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-13 11:23
こんにちは、じゃんぬ です。

引用:

さくらさんの書き込み (2005-09-13 11:19) より:

基本的にあまり「登録」を意識しない仕様なので、
どんどん入力すると勝手にどんどんCommitされます。


すごい仕様ですね... いいのかな... (^-^;)

引用:

よって、入力エリアを出た時点でのチェックとかじゃんぬねっとさんのおっしゃる
終了時のチェック(ダメだったら終了させない)もしています。
うぅ。


チェックしているのは、随時 Commit しているからですよね...
悪意のある操作をしたら、サーバが大変なことになりそうなんですが...


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

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