WPF how do I create a textbox dynamically and find the textbox on a button click?

后端 未结 5 881
不思量自难忘°
不思量自难忘° 2021-02-04 04:19

I am creating a TextBox and a Button dynamically using the following code:

Button btnClickMe = new Button();
btnClickMe.Content = \"Cli         


        
相关标签:
5条回答
  • 2021-02-04 04:19

    You can get your original click handler to work by registering the name of the text box:

    someStackPanel.RegisterName(txtNumber.Name, txtNumber);
    

    This will then allow you to call FindName on the StackPanel and find the TextBox.

    0 讨论(0)
  • 2021-02-04 04:20

    Josh G had the clue that fixed this code: use RegisterName().

    Three benefits here:

    1. Doesn't use a member variable to save the reference to the dynamically created TextBox.
    2. Compiles.
    3. Complete code.

      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);
              }
          }
      }
      
    0 讨论(0)
  • 2021-02-04 04:23

    If you want to do a comprehensive search through the visual tree of controls, you can use the VisualTreeHelper class.

    Use the following code to iterate through all of the visual children of a control:

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parentObj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(parent, i);
    
        if (child is TextBox)
            // Do something
    }
    

    If you want to search down into the tree, you will want to perform this loop recursively, like so:

    public delegate void TextBoxOperation(TextBox box);
    
    public bool SearchChildren(DependencyObject parent, TextBoxOperation op)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(parent, i);
    
            TextBox box = child as TextBox;
    
            if (box != null)
            {
                op.Invoke(box);
                return true;
            }
    
            bool found = SearchChildren(child, op);
    
            if (found)
                return true;
        }
    }
    
    0 讨论(0)
  • 2021-02-04 04:42

    Is there any way you can make the TextBox control a field in your class instead of a variable inside your generator method

    public class MyWindow : Window
    {
        private TextBox txtNumber;
    
        public void Window_Loaded()
        {
            GenerateControls();
        }
    
        public void GenerateControls()
        {
            Button btnClickMe = new Button();
            btnClickMe.Content = "Click Me";
            btnClickMe.Name = "btnClickMe";
            btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
            someStackPanel.Childern.Add(btnClickMe);
            txtNumber = new TextBox();
            txtNumber.Name = "txtNumber";
            txtNumber.Text = "1776";
            someStackPanel.Childern.Add(txtNumber);
        }
    
        protected void ClickMeClick(object sender, RoutedEventArgs e)
        {    
            // Find the phone number    
            string message = string.Format("The number is {0}", txtNumber.Text);        
            MessageBox.Show(message);
        }
    }
    
    0 讨论(0)
  • 2021-02-04 04:46

    Another method is to set the associated TextBox as Button Tag when instanciating them.

    btnClickMe.Tag = txtNumber;
    

    This way you can retrieve it back in event handler.

    protected void ClickMeClick(object sender, RoutedEventArgs e)
    {
        Button btnClickMe = sender as Button;
        if (btnClickMe != null)
        {
            TextBox txtNumber = btnClickMe.Tag as TextBox;
            // ...
        }
    }
    
    0 讨论(0)
提交回复
热议问题