none
VB.Net项目中用户控件内获取项目窗体中控件数量异常 RRS feed

  • 问题

  • 环境:Win7+VS2013+.Net 4.5
    描述:想做一个自动调整控件位置的用户控件,在制做过程中,碰到获取窗体中控件数量异常的问题。镐了两天,还没解决,希望各位大大,帮忙看下。
    环境重现:
    1 新建一个标准Windows项目
    2    添加一个用户控件(非WPF),注意是用户控件哟。
    3    复制如下代码到用户控件代码中
    '以下为用户控件中代码
    Imports System.Reflection
    Imports System.Text
    Public Class AutoSize
        Declare Function GetParent Lib "user32" Alias "GetParent" (ByVal hwnd As Integer) As Integer
        Dim FrmHwnd As Integer '主窗体句柄
        Dim FrmW, FrmH, NewFrmW, NewFrmH As Integer
        Dim FrmTime As New Timer
        Dim RunForm As Form
        Dim FrmKj As Control
        Private Sub AutoSize_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed '删除控件时停止计时器
            FrmTime.Stop()
            FrmTime.Dispose()
        End Sub
        Private Sub AutoSize_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' Me.Visible = False
            FrmHwnd = GetParent(Me.Handle) '获取父窗体句柄
            GetFrmSize(FrmHwnd, FrmW, FrmH) '获取父窗体初始大小
            FrmTime.Interval = 5000 '定义监控频率
            AddHandler FrmTime.Tick, AddressOf ReplaceSize '’定义委托
            FrmTime.Start()

            Dim myAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
            Dim TheTypes As Type() = myAssembly.GetTypes()
            Dim myType As Type
            For Each myType In TheTypes '枚举命令空间所有东东
                If myType.BaseType.ToString = "System.Windows.Forms.Form" Then '判断是否窗体
                    RunForm = Activator.CreateInstance(myType) '窗体实例化
                End If
            Next
        End Sub
        Sub ReplaceSize()
            GetFrmSize(FrmHwnd, NewFrmW, NewFrmH) '获取父窗体现在大小
            If NewFrmW <> FrmW Or NewFrmH <> FrmH Then '判断父窗体有无变化
                FrmW = NewFrmW : FrmH = NewFrmH '更新窗体大小变量
                'Form有大小变化,做后续处理
            Else
                MsgBox(RunForm.Controls.Count)
                '不知道什么原因,在From中添加或删除控件,这里的值不会变化
                '但如果执行一次 重新生成解决方案后 ,又是正确的。我现在就卡在这个地方了,不能实时的获取到Form中的正确信息。各位看观。何解?????
                '这里要获取Form中所有需要调整控件的位置信息,因为获取到的控件数量都异常,现在卡在这里了
            End If
        End Sub
        Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integer
        Private Function GetFrmSize(Frmhwnd As Integer, <Runtime.InteropServices.Out()> ByRef FrmW As Object, <Runtime.InteropServices.Out()> ByRef FrmH As Object) As Integer
            Try
                Dim ls As RECT
                GetWindowRect(Frmhwnd, ls)
                FrmW = ls.Right - ls.Left
                FrmH = ls.Bottom - ls.Top
                Return 1
            Catch ex As Exception
                Return 0
            End Try
        End Function
        Private Structure RECT
            Dim Left As Integer
            Dim Top As Integer
            Dim Right As Integer
            Dim Bottom As Integer
        End Structure
    End Class
    4   返回到From窗体设计界面,添加或删除相应有界面控件(Label或Button等),查看效果。
    5  源码下载 http://share.weiyun.com/65342fc81628d3630cad718240347b50
    6    如果那位大大,已解决此问题,麻烦发送一份源码至2801172807@qq.com 
    2015年9月3日 8:15

答案

  • 您好,

    因為您是從Type建立Form,所以建置過後才會知道那個Form上有那些控項。

    您可以直接取得目前的Form,如下

    'Dim myAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
    'Dim TheTypes As Type() = myAssembly.GetTypes()
    'Dim myType As Type
    'For Each myType In TheTypes '枚举命令空间所有东东
    '    If myType.BaseType.ToString = "System.Windows.Forms.Form" Then '判断是否窗体
    '        RunForm = Activator.CreateInstance(myType) '窗体实例化
    '    End If
    'Next
    '改FindForm
    RunForm = Me.FindForm()


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2015年9月3日 10:32

全部回复