当前位置:  开发笔记 > 编程语言 > 正文

WPF如何动态创建文本框并在按钮单击时找到文本框?

如何解决《WPF如何动态创建文本框并在按钮单击时找到文本框?》经验,为你挑选了3个好方法。

我使用以下代码创建动态TextBoxButton动态:

Button btnClickMe = new Button();
btnClickMe.Content = "Click Me";
btnClickMe.Name = "btnClickMe";
btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);

someStackPanel.Childern.Add(btnClickMe);

TextBox txtNumber = new TextBox();
txtNumber.Name = "txtNumber";
txtNumber.Text = "1776";

someStackPanel.Childern.Add(txtNumber);

我联系了Click Me按钮的点击事件.单击我按钮甚至被正确触发.但是我找不到TextBox我动态输入的内容.

这是我点击我的活动:

protected void ClickMeClick(object sender, RoutedEventArgs e)
{
    // Find the phone number
    TextBox txtNumber = this.someStackPanel.FindName("txtNumber") as TextBox;

    if (txtNumber != null)
    {
        string message = string.Format("The number is {0}", txtNumber.Text);

        MessageBox.Show(message);    
    }
    else
    {
        MessageBox.Show("Textbox is null");
    }
}

我该TextBox txtNumber怎么找到?



1> hughdbrown..:

Josh G有修复此代码的线索:使用RegisterName().

这里有三个好处:

    不使用成员变量来保存对动态创建的TextBox的引用.

    编译.

    完整的代码.

    using System;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace AddControlsDynamically
    {
        public partial class Window1 : Window
        {
            public void Window_Loaded(object sender, RoutedEventArgs e)
            {
                GenerateControls();
            }
            public void GenerateControls()
            {
                Button btnClickMe = new Button();
                btnClickMe.Content = "Click Me";
                btnClickMe.Name = "btnClickMe";
                btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
                someStackPanel.Children.Add(btnClickMe);
                TextBox txtNumber = new TextBox();
                txtNumber.Name = "txtNumber";
                txtNumber.Text = "1776";
                someStackPanel.Children.Add(txtNumber);
                someStackPanel.RegisterName(txtNumber.Name, txtNumber);
            }
            protected void CallMeClick(object sender, RoutedEventArgs e)
            {
                TextBox txtNumber = (TextBox) this.someStackPanel.FindName("txtNumber");
                string message = string.Format("The number is {0}", txtNumber.Text);
                MessageBox.Show(message);
            }
        }
    }
    



2> Michaël Carp..:

另一种方法是将关联设置TextBoxButton Tag实例化时.

btnClickMe.Tag = txtNumber;

这样您就可以在事件处理程序中将其检索回来.

protected void ClickMeClick(object sender, RoutedEventArgs e)
{
    Button btnClickMe = sender as Button;
    if (btnClickMe != null)
    {
        TextBox txtNumber = btnClickMe.Tag as TextBox;
        // ...
    }
}



3> Josh G..:

您可以通过注册文本框的名称来使原始点击处理程序正常工作:

someStackPanel.RegisterName(txtNumber.Name, txtNumber);

然后,这将允许您在StackPanel上调用FindName并找到TextBox。

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有