如何获取其Name在运行时分配的TextBox的Text值?

时间:2009-11-18 10:59:26

标签: c# wpf xaml textbox

我正在使用以下代码创建 TextBox

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;

因为“FirstName”将在运行时定义。那么如何在编译时不知道文本框的名称的情况下获取文本框的文本值?

以下是我到目前为止的内容,但它表示即使在运行时定义它也无法找到“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 个答案:

答案 0 :(得分:3)

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

private TextBox _textbox

在您的课程顶部,并将其设置为您在代码中添加的TextBox。然后,您可以在Button_Save事件处理程序中引用它。

答案 1 :(得分:3)

您可以像这样检索它:

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可以使用FindName找到任何元素:

 var c = (FrameworkElement)this.FindName("somename");

答案 4 :(得分:0)

我不能写评论,所以这是对你评论的回复。

为什么不使用

Dictionary<string, TextBox> 

作为一个类属性? 这样你就可以在类中保留对无限数量的文本框实例的引用,并且可以通过字典中的名称轻松访问它们?