DOBON.NET DOBON.NETプログラミング掲示板過去ログ

隠れたコントロールの再表示

分類:[.NET]

図のようにFromに(1)のPanel1、(2)のVScrollBar1
(3)(4)のTextBoxを配置しています。
+-------------------------------------------+
|  (1)                                 |    |
|                                      |    |
|                                      |    |
|              +-------+               |    |
|              |  (3)  |               |    |
|              +-------+               |    |
|                                      |    |
|                                      |    |
|                                      |    |
|                                      |(2) |
|                                      |    |
|                                      |    |
|                                      |    |
|                                      |    |
|                                      |    |
|              +-------+               |    |
|              |  (4)  |               |    |
|              +-------+               |    |
|                                      |    |
+-------------------------------------------+

VScrollBar1でPanel1内のコントロールをスクロールするために
下記のような記述をしています。

    Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As ScrollEventArgs) Handles VScrollBar1.Scroll
        Panel1.Location = New Point(0, 0 - VScrollBar1.Value)
    End Sub

このプログラムを実行させてスクロールさせると正しくスクロール
していますが、1点だけ問題点があります。
フォームのサイズを小さくしてコントロールの(4)が隠れるようにしてから
スクロールさせると(4)が表示されません。
フォームのサイズを元に戻すと(4)が表示されてきます。
フォームのResizeで隠れたコントロールをスクロールで
正しく表示させるようにするにはどのようにすれば良いですか。
分かりづらい文章と図で申し訳ありませんが宜しくお願いします。
■No6904に返信(ことぶきさんの記事)
> このプログラムを実行させてスクロールさせると正しくスクロール
> していますが、1点だけ問題点があります。
> フォームのサイズを小さくしてコントロールの(4)が隠れるようにしてから
> スクロールさせると(4)が表示されません。
> フォームのサイズを元に戻すと(4)が表示されてきます。
> フォームのResizeで隠れたコントロールをスクロールで
> 正しく表示させるようにするにはどのようにすれば良いですか。
> 分かりづらい文章と図で申し訳ありませんが宜しくお願いします。

そもそもPanelコントロールのAutoScrollを使った方がよいでしょう。
Panelに収まらないコントロールなどないのに、常にスクロールバーが表示されるのは違和感があります。
何かしろの理由があるとは思うのですが、それがわからないことには...
■No6908に返信(java.lang.Nullpoさんの記事)
> ■No6904に返信(ことぶきさんの記事)
>>このプログラムを実行させてスクロールさせると正しくスクロール
>>していますが、1点だけ問題点があります。
>>フォームのサイズを小さくしてコントロールの(4)が隠れるようにしてから
>>スクロールさせると(4)が表示されません。
>>フォームのサイズを元に戻すと(4)が表示されてきます。
>>フォームのResizeで隠れたコントロールをスクロールで
>>正しく表示させるようにするにはどのようにすれば良いですか。
>>分かりづらい文章と図で申し訳ありませんが宜しくお願いします。
>
> そもそもPanelコントロールのAutoScrollを使った方がよいでしょう。
> Panelに収まらないコントロールなどないのに、常にスクロールバーが表示されるのは違和感があります。
> 何かしろの理由があるとは思うのですが、それがわからないことには...

説明不足で申し訳ありません。
現在開発中のシステムで、画面の縦位置に収まらないデータと
横位置に収まらないデータを同時に表示するプログラムを作成しています。
間違いなく収まらないのでスクロールバーが常に表示されるのは正常だと
思います。二つの表示領域を離して表示するのであれば縦横の
スクロールバーが表示されるのも我慢できるのですが画面に最大限
表示させるためには二つの領域をくっつけて表示させたいと思っていますが
その場合、今回の設計では二つの縦のスクロールバーが並んでしまいます。
このような事情がありますので、何とか今回の課題を解決したいと思っています。
今回の質問に至る以前の質問が下記ですのでよろしくお願い致します。

http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=6824&rev=&no=0
■No6904に返信(ことぶきさんの記事)

ことぶきさん、こんにちは。

> フォームのサイズを小さくしてコントロールの(4)が隠れるようにしてから
> スクロールさせると(4)が表示されません。

フォームとスクロールバーの縮尺があわなくなるためと思われます。
かなりあやしいコードですが、C#のサンプルを載せておきます。


private void vScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
{
int x = (int)((double)vScrollBar1.Value / (double)vScrollBar1.Maximum * (double)panel1.Height);
panel1.Location = new Point(0, 0 - x);
}
■No6921に返信(ぱるさんの記事)
> ■No6904に返信(ことぶきさんの記事)
>
> ことぶきさん、こんにちは。
>
>>フォームのサイズを小さくしてコントロールの(4)が隠れるようにしてから
>>スクロールさせると(4)が表示されません。
>
> フォームとスクロールバーの縮尺があわなくなるためと思われます。
> かなりあやしいコードですが、C#のサンプルを載せておきます。
>
>
> private void vScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
> {
> int x = (int)((double)vScrollBar1.Value / (double)vScrollBar1.Maximum * (double)panel1.Height);
> panel1.Location = new Point(0, 0 - x);
> }
>
ぱるさん、こんにちは。
Panel1のスクロールが非常にスムーズになりました。
残念ですが、隠れたコントロールは表示されませんでした。
引き続き宜しくお願い致します。
■No6923に返信(ことぶきさんの記事)
> ■No6921に返信(ぱるさんの記事)
>>■No6904に返信(ことぶきさんの記事)
>>
>>ことぶきさん、こんにちは。
>>
> >>フォームのサイズを小さくしてコントロールの(4)が隠れるようにしてから
> >>スクロールさせると(4)が表示されません。
>>
>>フォームとスクロールバーの縮尺があわなくなるためと思われます。
>>かなりあやしいコードですが、C#のサンプルを載せておきます。
>>
>>
>>private void vScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
>>{
>>int x = (int)((double)vScrollBar1.Value / (double)vScrollBar1.Maximum * (double)panel1.Height);
>>panel1.Location = new Point(0, 0 - x);
>>}
>>
> ぱるさん、こんにちは。
> Panel1のスクロールが非常にスムーズになりました。
> 残念ですが、隠れたコントロールは表示されませんでした。
> 引き続き宜しくお願い致します。

ぱるさん、申し訳ありません。
サンプルコードのとおりにして正しく動作しました。
VBでテストして居たので、サンプルコードをVBに変換して
テストした結果です。(たぶん変換時の自分のミスです)
C#で環境を作り直して実行したら正常に表示されました。
本当に有難うございます。
解決済み!
■No6924に返信(ことぶきさんの記事)
> ■No6923に返信(ことぶきさんの記事)
>>■No6921に返信(ぱるさんの記事)
> >>■No6904に返信(ことぶきさんの記事)
> >>
> >>ことぶきさん、こんにちは。
> >>
>>>>フォームのサイズを小さくしてコントロールの(4)が隠れるようにしてから
>>>>スクロールさせると(4)が表示されません。
> >>
> >>フォームとスクロールバーの縮尺があわなくなるためと思われます。
> >>かなりあやしいコードですが、C#のサンプルを載せておきます。
> >>
> >>
> >>private void vScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
> >>{
> >>int x = (int)((double)vScrollBar1.Value / (double)vScrollBar1.Maximum * (double)panel1.Height);
> >>panel1.Location = new Point(0, 0 - x);
> >>}
> >>
>>ぱるさん、こんにちは。
>>Panel1のスクロールが非常にスムーズになりました。
>>残念ですが、隠れたコントロールは表示されませんでした。
>>引き続き宜しくお願い致します。
>
> ぱるさん、申し訳ありません。
> サンプルコードのとおりにして正しく動作しました。
> VBでテストして居たので、サンプルコードをVBに変換して
> テストした結果です。(たぶん変換時の自分のミスです)
> C#で環境を作り直して実行したら正常に表示されました。
> 本当に有難うございます。

コントロールが隠れた原因が分かりました。
Panel1のAnchorプロパティをTop,Buttom,Left,Rightにしていました。
このためフォームを伸ばすとPanel1も伸びて(コントロールの位置が変わる)
そのままスクロールしてもコントロールが表示されませんでした。
このような時はTop,Buttomだけの設定にしないといけないんですね。
みなさま、お騒がせしました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板