You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中如何从StackPanel获取动态创建的TextBox名称及值

WPF动态创建TextBox后的名称与值获取方案

问题根源

WPF中的StackPanel没有WinForms里的Controls属性,你之前的代码误用了WinForms的API,这是导致错误的核心原因。另外你创建的TextBox名称是Bet1、Bet2这类格式,而非代码中写的txtBet,名称匹配也存在问题。

三种可行解决方案

方案1:使用FindName精准查找

利用控件的FindName方法,通过设置的Name属性定位目标TextBox:

private void cboRunder_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var cboRunder = sender as ComboBox;
    string strRunder = cboRunder.SelectedValue.ToString();

    switch (strRunder)
    {
        case "Blinds":
            // 查找名称为Bet1的TextBox
            TextBox targetTxt = panelBet.FindName("Bet1") as TextBox;
            if (targetTxt != null)
            {
                string textBoxValue = targetTxt.Text;
                // 这里添加你的业务逻辑
            }
            break;
    }
}

注意:调用FindName前,TextBox必须已经通过panelBet.Children.Add()添加到可视化树中,否则无法找到。

方案2:遍历Children集合筛选所有TextBox

如果需要批量获取所有动态创建的TextBox的名称和值,可以遍历panelBet.Children集合,筛选出TextBox类型的元素:

private void cboRunder_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var cboRunder = sender as ComboBox;
    string strRunder = cboRunder.SelectedValue.ToString();

    switch (strRunder)
    {
        case "Blinds":
            foreach (var child in panelBet.Children)
            {
                if (child is TextBox txt)
                {
                    string txtName = txt.Name;
                    string txtValue = txt.Text;
                    // 处理每个TextBox的名称和值
                }
            }
            break;
    }
}

方案3:提前存储TextBox引用(推荐)

在创建TextBox时,将它们存入一个集合,后续直接从集合中获取,避免遍历或查找的开销:

  1. 先在类中定义集合:
private List<TextBox> _dynamicTextBoxes = new List<TextBox>();
  1. 修改创建TextBox的代码,将实例加入集合:
int f = 1;
foreach (TextBox txt2 in txtBet)
{
    string name = "Bet" + f.ToString();
    txt2.Name = name;
    txt2.Text = name;
    // 其他属性设置...
    panelBet.Children.Add(txt2);
    _dynamicTextBoxes.Add(txt2); // 添加到集合
    f++;
}
  1. 后续取值时直接操作集合:
private void cboRunder_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var cboRunder = sender as ComboBox;
    string strRunder = cboRunder.SelectedValue.ToString();

    switch (strRunder)
    {
        case "Blinds":
            // 获取指定名称的TextBox
            var targetTxt = _dynamicTextBoxes.FirstOrDefault(txt => txt.Name == "Bet1");
            if (targetTxt != null)
            {
                string textBoxValue = targetTxt.Text;
            }
            // 或者遍历所有动态TextBox
            foreach (var txt in _dynamicTextBoxes)
            {
                string name = txt.Name;
                string value = txt.Text;
            }
            break;
    }
}

额外注意事项

  • 动态创建的TextBox的Name属性必须保证唯一,避免出现重名导致查找错误
  • 方案3的性能最优,尤其当panelBet中子元素数量较多时,推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:05:27