VB.NET点击按钮向FlowLayoutPanel添加自定义控件仅显示一个的问题
问题原因
问题出在自定义控件的实例化位置错误:
- 你把
lll声明为了窗体级全局变量,整个程序运行过程中只执行了一次New LinkLabelList(),从头到尾只创建了1个自定义控件对象 - WinForm有明确的控件归属规则:同一个控件实例同一时间只能有一个父容器。你每次点击按钮都反复修改这同一个实例的属性、再把它往FlowLayoutPanel里添加时,系统会自动先把这个控件从之前的位置移除,再重新挂到容器里,所以永远只能显示一个控件,之前添加的条目都会消失,无法实现追加多个条目的效果。
修复方法
把控件实例化的代码放到按钮点击事件内部,保证每次点击按钮的时候都生成一个全新的控件实例,再设置属性、添加到容器即可。
修正后的按钮事件代码:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 每次点击都创建全新的控件实例 Dim lll As New LinkLabelList lll.UserMail = TextBox1.Text lll.Icon = My.Resources.user16x ' 可选:增加空值校验,避免添加空的无效条目 If Not String.IsNullOrWhiteSpace(lll.UserMail) Then FlowLayoutPanel1.Controls.Add(lll) End If ' 清空输入框,方便下次输入 TextBox1.Clear() TextBox1.Focus() End Sub
额外优化提示:你现在实现的鼠标悬浮变色逻辑,给每个子控件都单独绑定了MouseEnter、MouseLeave事件,后续如果控件内新增其他元素还要重复绑定事件,维护成本很高。可以直接重写自定义控件的
OnMouseEnter和OnMouseLeave方法统一处理背景色逻辑,不需要逐个给子控件绑定事件,还可以开启双缓冲减少切换背景色时的闪烁问题。
内容的提问来源于stack exchange,提问作者Lider13
相关产品推荐
相关产品推荐

