代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何获取在运行时分配名称的文本框的文本值?

  •  2
  • Edward Tanguay  · 技术社区  · 15 年前

    我正在创造一个

    TextBox textBox = new TextBox();
    textBox.Name = propertyName;
    textBox.Text = value;
    textBox.Width = FormControlColumnWidth;
    textBox.SetResourceReference(Control.StyleProperty, "FormTextBoxStyle");
    
    sp.Children.Add(textBox); //StackPanel
    FormBase.Children.Add(sp);
    

    按钮点击 ,我想获取该文本框的文本值,但无法在代码中指定:

    string firstName = FirstName.Text;
    

    如何在编译时不知道Textbox的名称的情况下获取Textbox的文本值?

    以下是迄今为止我所知道的,但是它说它找不到“FirstName”,即使它是在运行时定义的:

    private void Button_Save(object sender, RoutedEventArgs e)
    {
        using (var db = Datasource.GetContext())
        {
            var item = (from i in db.Customers
                            where i.Id == TheId
                            select i).SingleOrDefault();
    
            item.FirstName = ((TextBox)FindResource("FirstName")).Text;
            db.SubmitChanges();
        }
    }
    

    可复制示例:

    我在这里贴了一个完整的可复制的例子: Why can't I access a TextBox by Name with FindName()? ,或许更容易分析。

    5 回复  |  直到 8 年前
        1
  •  3
  •   Rune Grimstad    15 年前

    最简单的解决方案可能是在代码的某个地方保留对文本框的引用。只需添加一个

    private TextBox _textbox
    

    并将其设置为您在代码中添加的文本框。然后您可以在按钮保存事件处理程序中引用它。

        2
  •  3
  •   Blindy    15 年前

    你可以这样取回它:

    TextBox tb=(TextBox)Children.First(w=>w.Name=="FirstName");
    

    不知道那是什么 sp 在代码中是,但如果确实需要第二级控件,可以在第一级上运行foreach循环,然后在第二级上按名称搜索。

        3
  •  2
  •   Community CDub    8 年前

    这个问题的答案是你必须使用 this.RegisterName("FirstName", textBox); Why can't I access a TextBox by Name with FindName()?

        4
  •  1
  •   Henk Holterman    15 年前

    你可以使用 FindName :

     var c = (FrameworkElement)this.FindName("somename");
    
        5
  •  0
  •   Zenon    15 年前

    为什么不使用

    Dictionary<string, TextBox> 
    

    这样,您就可以在类中保留对数量不定的textbox实例的引用,并在字典中按名称轻松地访问它们?

    推荐文章