分類:[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のみを絞ってループを構築する方法はありますでしょうか?
こちらも勉強のためお教え頂けるとありがたいです。
よろしくお願いいたします。