You need to enable JavaScript to run this app. C# WinForm 如何获取动态生成的文本框(TextBox)的值
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm 如何获取动态生成的文本框(TextBox)的值

WinForm动态生成TextBox的取值实现方法

你当前的场景是桌面端WinForm开发,和ASP.NET WebForm的服务端控件取值逻辑完全不同,不需要依赖页面回传、ViewState这类机制,核心是拿到动态生成的TextBox实例,直接读取其Text属性即可。
下面提供两种适配你现有代码的可落地方案,可根据实际需求选择:


方案1:基于现有命名规则直接匹配取值(零改造成本)

你当前的生成逻辑已经给每个动态TextBox设置了统一的命名规则TextBox{生成序号},不需要改动原生成代码,直接通过WinForm原生的Controls.Find方法按名称匹配控件实例即可。

注意:Controls.Find方法的第二个参数设为true时,会递归搜索所有子容器内的控件,哪怕后续把动态文本框放到Panel、GroupBox等容器里,也能正确匹配到,避免搜索遗漏。
示例取值代码:

// 获取指定序号动态文本框的取值
private string GetDynamicTextBoxValue(int targetIndex)
{
    string controlName = "TextBox" + targetIndex;
    Control[] matchedControls = this.Controls.Find(controlName, true);
    
    if (matchedControls.Length > 0)
    {
        TextBox targetBox = matchedControls[0] as TextBox;
        if (targetBox != null)
        {
            return targetBox.Text.Trim();
        }
    }
    return string.Empty;
}

如果要批量获取所有动态生成的文本框值,只要遍历所有匹配到的同名前缀控件即可。


方案2:用集合统一管理动态控件(更稳定,推荐)

相比靠名称搜索匹配,直接在生成TextBox时把实例存入专门的泛型集合,取值时直接通过集合索引读取引用,性能更好,也不会因为重名、容器层级变化导致匹配错误。
基于你现有代码优化后的完整实现参考:

public partial class Form1 : Form
{
    // 把原有的计数器变量名优化,避免和WinForm Control基类混淆
    private int textBoxCreateIndex = 1;
    // 专门存储动态生成的TextBox实例
    private readonly List<TextBox> _dynamicTextBoxList = new List<TextBox>();

    public Form1()
    {
        InitializeComponent();
        // 可选:给窗体开启自动滚动,避免动态控件过多超出可视范围
        this.AutoScroll = true;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        TextBox txt = new TextBox();
        txt.Top = textBoxCreateIndex * 25;
        txt.Left = 100;
        // 可选:手动设置文本框尺寸,避免默认宽度不符合UI预期
        txt.Size = new Size(200, 25);
        txt.Name = "TextBox" + textBoxCreateIndex.ToString();
        
        // 把控件添加到窗体的同时,存入集合统一管理
        this.Controls.Add(txt);
        _dynamicTextBoxList.Add(txt);
        
        textBoxCreateIndex++;
    }

    // 示例:批量读取所有动态文本框的取值
    private void buttonReadAllValues_Click(object sender, EventArgs e)
    {
        foreach (var inputBox in _dynamicTextBoxList)
        {
            // 直接通过控件实例读取Text值,还能通过Name对应到生成序号
            string value = inputBox.Text.Trim();
            // 可在此处把值存入业务模型、做输入校验等操作
            MessageBox.Show($"动态文本框 {inputBox.Name} 的取值为:{value}");
        }
    }
}

实用注意点

  • 原代码里的计数器变量名control和WinForm的控件基类Control重名,容易引发编译歧义,建议改为更有语义的命名
  • 如果需要给每个动态文本框附带关联的业务数据,可直接给Tag属性赋值,取值时同步读取即可,比如txt.Tag = "关联业务ID:10086"

内容的提问来源于stack exchange,提问作者GabrielH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 18:15:07