Foxtable(狐表)用户栏目专家坐堂 → 如何获取某个面板里的所有指定类型的控件


  共有2671人关注过本帖树形打印复制链接

主题:如何获取某个面板里的所有指定类型的控件

帅哥哟,离线,有人找我吗?
rjh4078
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3361 积分:24808 威望:0 精华:0 注册:2012/3/26 21:47:00
如何获取某个面板里的所有指定类型的控件  发帖心情 Post By:2016/5/24 13:27:00 [只看该作者]

如题  我想动态刷新控件  现在要求在生成新的控件之前将当前panel中的label控件全部删除

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/5/24 14:18:00 [只看该作者]

For Each o As Object in 控件.Children

 

或者

 

For Each o As object in 控件.BaseControl.Controls


 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3361 积分:24808 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2016/5/24 20:28:00 [只看该作者]

请教下各位老师  我想在一个panel里动态添加lable  比如 一排一个或者一排N个 N排M个  如何控制呢

我现在生成的 只能指定left top 排列很混乱 


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/5/24 20:31:00 [只看该作者]

方法一:盒子思维,一行n个放在一个panel里,设置好停靠;n行n个panel,放在一个大panel里,设置好停靠。

 

方法二:直接控制left、top,只要计算精确,不会混乱的。


 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3361 积分:24808 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2016/5/26 20:26:00 [只看该作者]

方法2中如何控制left top呢? 比如 如何控制一排按照我设计的个数排 ? 按钮个数是不确定的 比如我想一排2个 这个要怎么来写

 

我找到之前一个案列的代码是这样的  但是套过来用  达不到效果 按钮会重叠在一起  或者互相覆盖了

Dim tab1 As WinForm.TabControl
tab1 = e.Form.CreateControl("tab1", ControlTypeEnum.TabControl)
e.Form.Controls("Panel1").addcontrol(tab1)
tab1.Dock = System.Windows.Forms.DockStyle.fill

e.Form.Controls("tab1").basecontrol.ItemSize=new Size(60,55)
tab1.Multiline=True
Dim fnt As new Font("微软雅黑",16,FontStyle.Regular)
tab1.Font=fnt
Dim x As Integer
Dim str As String
Dim pan As WinForm.Panel
For x =65 To 90
    str=chr(x)
    tab1.TabPages.Add(str,str)
    pan = e.Form.CreateControl("pan" & chr(x), ControlTypeEnum.panel)
    pan.Dock = System.Windows.Forms.DockStyle.fill
    pan.AutoScroll=True
    pan.BackColor = color.Silver
   
    e.Form.Controls("tab1").basecontrol.tabpages(str).addcontrol(pan)
   
Next


Dim dt As DataTable
Dim sqltxt As String="S elect 药材编码,名称 from {产品资料} order by 名称"
Dim sql As String="sel ect count(*) as 总行数 from{产品资料} where 药材编码 is not null"
Dim c md As ne w SQL Command
cm d.C
cm d.CommandText=sql
dt=cm d.ExecuteReader
If dt.DataRows(0)("总行数")=DataTables("产品资料").datarows.count Then
    dt=DataTables("产品资料")
Else
    Dim cmd1 As new SQLCommand
    cmd1.C
    cmd1.CommandText=sqltxt
    dt=cmd1.ExecuteReader
End If
Dim lst As List(of DataRow)
lst=dt.Select("","名称")
Dim btn As WinForm.button
Dim i As Integer =0
For x =65 To 90
    i=0
    ''For Each dr As DataRow In dt.DataRows
    For Each dr As DataRow In lst
        If left(GetPY(dr("名称"), True),1)=chr(x) Then
            btn = e.Form.CreateControl(dr("药材编码"), ControlTypeEnum.button)
            btn.width=250
            btn.height=70

                btn.BackColor=Color.white
         btn.VisualStyle = VisualStyleEnum.office2007blue 
            btn.Text = dr("名称")
            btn.Left = 35+(i Mod 4)*280
            btn.Top = 35+(i\4)*95
           
           
            btn.Image = GetImage("noselect.png")
            btn.TextImageRelation = TextImageRelation.ImageBeforeText
            btn.basecontrol.tag=0
            e.Form.Controls("pan" & left(GetPY(dr("名称"), True),1)).AddControl(btn)
           
            i=i+1
        End If
    Next
Next
e.Form.baseform.WindowState=2

 

核心代码是

btn.Left = 35+(i Mod 4)*280
            btn.Top = 35+(i mod 4)*95

但是我套过来用 发现不行 比如有4个按钮 只能显示2个 互相重叠在一起了

 


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/5/26 20:37:00 [只看该作者]

如果确定个数,那样好办啊,记录个数就行了

 

Dim count As Integer = 0

Dim x As Integer = 0

Dim y As Integer = 0

 

 

x += 控件.Width + 20

If count >0 AndAlso count mod 4 = 0 then

    x = 0

    y = y + 控件.Height + 20

End If

控件.left = x

控件.top = y

count += 1

 


 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3361 积分:24808 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2016/5/26 20:44:00 [只看该作者]

以下是引用大红袍在2016/5/26 20:37:00的发言:

如果确定个数,那样好办啊,记录个数就行了

 

Dim count As Integer = 0

Dim x As Integer = 0

Dim y As Integer = 0

 

 

x += 控件.Width + 20

If count >0 AndAlso count mod 4 = 0 then

    x = 0

    y = y + 控件.Height + 20

End If

控件.left = x

控件.top = y

count += 1

 

这个不能控制换行把  比如大于4行 就换一行重新生成 而且你这个没有和变量count挂一起 

 

 

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/5/26 20:45:00 [只看该作者]

分开啊

 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3361 积分:24808 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2016/5/28 14:51:00 [只看该作者]

最终还是用listview来搞定


 回到顶部