如何在程序运行时为LinkLabel添加OnClick事件并获取同行TextBox名称至变量AA
动态生成LinkLabel与TextBox的点击事件实现
需求说明
现有VB.NET代码可动态生成包含LinkLabel和TextBox的行控件,需要实现:点击每行的LinkLabel时,将该行对应TextBox的名称存入名为AA的变量。
实现方案
可以通过AddHandler在运行时为动态创建的LinkLabel绑定点击事件,具体步骤如下:
- 定义模块级变量:在窗体类中声明变量
AA,用于存储TextBox名称:
Dim AA As String Dim serial As Integer = 1
- 修改
addnewline方法:在创建LinkLabel后绑定其LinkClicked事件,同时修正原代码中重复Return的问题(原代码Return lbl后不会执行Return txt,改为Sub更合理):
Public Sub addnewline() Dim lbl As New System.Windows.Forms.LinkLabel Dim txt As New System.Windows.Forms.TextBox ' 配置LinkLabel Me.Controls.Add(lbl) lbl.Top = serial * 27 lbl.Left = 100 lbl.Text = serial.ToString() lbl.Name = "lbl" & serial ' 绑定点击事件 AddHandler lbl.LinkClicked, AddressOf LinkLabel_Click ' 配置TextBox Me.Controls.Add(txt) txt.Top = serial * 27 txt.Left = 200 txt.Height = 20 ' 原代码500高度不合理,调整为常规值 txt.Width = 100 txt.TextAlign = HorizontalAlignment.Center txt.Text = "text" & serial txt.Name = "txt" & serial serial += 1 End Sub
- 编写事件处理逻辑:在窗体类中添加
LinkLabel_Click方法,通过LinkLabel的名称提取序号,匹配对应TextBox并将名称存入AA:
Private Sub LinkLabel_Click(sender As Object, e As LinkLabelLinkClickedEventArgs) ' 将触发事件的控件转换为LinkLabel对象 Dim clickedLabel As LinkLabel = DirectCast(sender, LinkLabel) ' 从LinkLabel名称中提取序号(去掉"lbl"前缀) Dim serialNumber As String = clickedLabel.Name.Replace("lbl", "") ' 根据序号查找对应TextBox Dim targetTextBox As TextBox = DirectCast(Me.Controls.Find("txt" & serialNumber, True).FirstOrDefault(), TextBox) ' 找到TextBox后赋值给AA If targetTextBox IsNot Nothing Then AA = targetTextBox.Name ' 可添加测试代码验证结果,例如: ' MessageBox.Show("当前选中TextBox名称:" & AA) End If End Sub
原理说明
AddHandler是VB.NET中用于运行时动态绑定控件事件的方法,解决了动态生成控件无法在设计阶段绑定事件的问题。- 通过统一的命名规则(
lblN对应txtN),无需额外存储关联关系,即可快速匹配同一行的LinkLabel和TextBox。
内容的提问来源于stack exchange,提问作者Ahmed Saif
相关产品推荐
相关产品推荐

