【问题标题】:How can I get the Text value of a TextBox whose Name gets assigned at runtime?如何获取在运行时分配名称的 TextBox 的 Text 值?
【发布时间】:2011-08-29 02:55:04
【问题描述】:

我正在使用以下代码创建一个 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()?,也许更易于分析。

【问题讨论】:

    标签: c# wpf xaml textbox


    【解决方案1】:

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

    private TextBox _textbox
    

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

    【讨论】:

    • +1 的简单答案。在大多数情况下,仅存储对动态创建的控件的引用是最佳选择,而不是按名称搜索组件。
    • 但这是一个动态表单,根据读入的对象,可能有 1 个文本框或 50 个文本框,所以我无法在不知道会有多少的情况下为每个文本框创建一个属性。
    • 然后使用 Dictionary 甚至 Dictionary。使用控件的名称作为键,检索你需要的控件。
    【解决方案2】:

    你可以这样检索它:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • RegisterName 似乎可以工作,只要您使用 FindName 方法而不是 FindResource。
      【解决方案4】:

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

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

      【讨论】:

      【解决方案5】:

      我不会写cmets,所以这是对您评论的回复。

      为什么不使用

      Dictionary<string, TextBox> 
      

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

      【讨论】:

        猜你喜欢
        • 2011-03-21
        • 2013-01-10
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多