C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: PanelのAutoScrollPositionがおかしい?


(過去ログ 92 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■55020 / inTopicNo.1)  PanelのAutoScrollPositionがおかしい?
  
□投稿者/ なませ (1回)-(2010/11/14(Sun) 22:27:47)

分類:[VB.NET/VB2005 以降] 

2010/11/14(Sun) 22:33:14 編集(投稿者)
こんにちは。
VB.net(2008)でFormに配置したPanelに縦方向に自作コントロールを配置し、
所定のイベント(例えばボタンクリック)等で条件に合うコントロールを
Panelの一番上に表示するようなものを作ろうと考えています。
そこで、PanelにはAutoScrollPositionというプロパティがあり、これにスクロール位置を設定すれば
実現可能だと思い、試してみましたがうまくいきません。
自作コントロールだと分かりにくいので、TextBoxで代用したサンプルを掲載します。
※フォームForm1には、AutoScroll = TrueとしたパネルPanel1が配置されており、
 このパネルの外にテキストボックスTextBox1とボタンButton1を配置します。
 TextBox1に、コントロール検索条件(1〜100の数字)を入力し、
 Button1をクリックすることで、TextBox1に入力した数字と同じ入力のあるコントロールを
 パネルの一番上に表示させようというものです。

Public Class Form1
    Public Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        Dim txt As TextBox
        Dim y As Integer = 0

        For i As Integer = 1 To 100
            txt = New TextBox
            txt.Text = i.ToString
            Panel1.Controls.Add(txt)
            txt.Location = New Point(0, y)
            y += txt.Height + 5
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each ctr As Control In Panel1.Controls
            If ctr.GetType Is GetType(TextBox) AndAlso ctr.Text = TextBox1.Text Then
                'Panel1.AutoScrollPosition = New Point(0, 0)    '←ここのコメントアウトを外すとうまくいく
                Panel1.AutoScrollPosition = New Point(0, ctr.Location.Y)
                Exit For
            End If
        Next
    End Sub
End Class

現象としては、1回目のButton1_Clickでは該当コントロールがパネルの一番上に表示されるのですが、
2回目のButton1_Clickでは、スクロール位置が意図しない位置になってしまいます。
どうやら偶数回目のButton1_Clickがおかしくなるようです。
これはどうしてなのでしょうか?

また、サンプルでコメントアウトしている
    'Panel1.AutoScrollPosition = New Point(0, 0)    '←ここのコメントアウトを外すとうまくいく
の箇所のコメントを外す(つまり、一度スクロール位置をリセットする)と上記問題が発生せず、
期待通りの動作になります。

どなたか解説を頂けないでしょうか。よろしくお願いいたします。

また、上記質問とは直接関係ないのですが、上記サンプルで

    For Each ctr As Control In Panel1.Controls

のループでPanel1上のコントロールを取り出し、If文でそれがTextBoxであるかどうかを調べていますが、
もっと簡単にPanel1上のTextBoxのみを絞ってループを構築する方法はありますでしょうか?
こちらも勉強のためお教え頂けるとありがたいです。

よろしくお願いいたします。

引用返信 編集キー/
■55021 / inTopicNo.2)  Re[1]: PanelのAutoScrollPositionがおかしい?
□投稿者/ shu (176回)-(2010/11/14(Sun) 23:42:06)
2010/11/14(Sun) 23:56:43 編集(投稿者)

No55020 (なませ さん) に返信

AutoScrollPosition分コントロールの位置はずれるのでそのような現象が発生しているのだと思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -