@IT会議室は、2009年4月15日に新システムに移行し、さらに2012年5月29日にITエンジニアに特化した
質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用くださいませ。
- PR -

(windowsアプリ)パネル内のコントロールにフォーカスを移動するとスクロールバーが動く

1
投稿者投稿内容
タンク
会議室デビュー日: 2003/02/05
投稿数: 18
お住まい・勤務地: 神戸
投稿日時: 2004-04-20 13:26
vb.netでwindowsアプリケーションを作成しています。

フォーム内にパネルを作成しAutoScroll=trueとします。
パネル内にフォーカスがあたるコントロールA(ボタンなど)をパネルよりも大きなサイズで配置します。
パネル外にフォーカスがあたるコントロールBを配置します。

この画面でパネルのスクロールバーを下に移動した状態で
コントロールBからコントロールAにフォーカスを移すと
スクロールバーが勝手に動きコントロールAの左上のほうを表示してしまいます。

このフォーカス移動時のスクロールバーの動作を止めることは出来ないのでしょうか?

コントロールBのenableをfalseにすると起こらないのですが、コントロールBのイベントは取得したいのでenableはtrueにしています。
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2005-01-19 09:31
私も同じ現象で悩んでいます。
どうにか、スクロールさせない方法は無いのでしょうか?
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2005-01-19 10:00
解決しました。

コントロールBのEnterイベントでEnable = Falseにして、すぐにEnable = Trueにすることで
スクロールを無効化することが出来ました。
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-01-19 10:51
カウンターさんの手順を実装すると、Tabキーによるフォーカスの移動ができなくなり、結果として挙動が変わってしまうと思います。

私が試した手順は次の通りです。

1.WindowsフォームにPanel1を追加し、Panel1.AutoScroll=Trueを設定
2.Panel1にパネルより大きなTextBox1を追加
3.パネルの外にTextBox2を追加
4.次のコードを記述
コード:
Private Sub TextBox2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.Enter
    Me.Enabled = False
    Me.Enabled = True
End Sub


5.実行してTabキーによってフォーカスを移動させてみる(フォーカスが移動しません)
6.4のコードをコメントアウトして実行してみる(フォーカスが移動します)

これは私見ですが、AutoScroll=Trueとしたときに、パネル内のフォーカスを得たコントロールが可視となるようにスクロールされるのは、ほとんどのケースにおいて妥当な動作と考えられます。

この「妥当な動作」に沿うようにアプリケーションのUI設計を見直すほうが苦労は少ないかもしれません。(もちろん、それが可能であればの話ですが)
@echo
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-01-19 12:15
無理やりっぽいですが、イベントを2つ作成して Panel 内のコントロールに登録すれば大丈夫なようです。(とりあえずボタンのみ確認)

復元処理は Move と LocationChanged イベントのどちらでも可。

フォーカスコントロールが完全にスクロールアウトしている場合はコントロール自体見えませんのでご注意を...

# C# です...
コード:
private void control_Enter(object sender, EventArgs e)
{
  (sender as Control).Tag = new Point(
    Math.Abs(panel1.AutoScrollPosition.X),
    Math.Abs(panel1.AutoScrollPosition.Y));
}

private void control_LocationChanged(object sender, EventArgs e)
{
  Control ctrl = sender as Control;

  if (ctrl.Tag != null)
  {
    /* 2回イベント処理するのが気にならなければ直接代入も可 */
    Point pos = (Point)ctrl.Tag;
    ctrl.Tag = null;
    panel2.AutoScrollPosition = pos;
  }
}


1

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

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