Как загрузить номер в текстовый список с & ldquo; для & rdquo; функция [дубликат]

Почему бы просто не отобразить его в веб-браузере пользователя?

14
задан Dave Clemmer 25 August 2011 в 16:37
поделиться

5 ответов

У Джоша G был ключ, который фиксировал этот код: use RegisterName ().

Три преимущества здесь:

  1. Не использует переменную-член для сохранения ссылки к динамически созданному TextBox.
  2. Компиляция.
  3. Полный код.
    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);
            }
        }
    }
    
15
ответ дан hughdbrown 15 August 2018 в 22:48
поделиться
  • 1
    Это хорошо работает. Я изменяю это на принятый ответ, потому что он делает то, что я изначально хотел. Другой хорошо работает, но я не хотел создавать текстовые поля и хранить их. – David Basarab 12 February 2009 в 22:08

Есть ли способ заставить TextBox управлять полем вашего класса вместо переменной внутри вашего метода генератора

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);
    }
}
2
ответ дан bendewey 15 August 2018 в 22:48
поделиться
  • 1
    Это сработает. Однако нет способа найти его? Что произойдет, если я скажу 10 текстовых полей? Является ли решение для создания List & lt; Textbox & gt; и просто используйте Linq, чтобы найти их? – David Basarab 11 February 2009 в 15:49
  • 2
    – David Basarab 11 February 2009 в 15:53
  • 3
    Код не компилируется: Childern, CallMeClick не определен и т. Д. – hughdbrown 11 February 2009 в 16:12
  • 4
    SomeStackPanel должен быть настроен в вашем Xaml. Этот код основан на выборке в вопросе OP. – bendewey 11 February 2009 в 16:22
  • 5

Если вы хотите выполнить полный поиск через визуальное дерево элементов управления, вы можете использовать класс VisualTreeHelper.

Используйте следующий код для повторения всех визуальных дочерних элементов элемента управления:

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parentObj); i++)
{
    DependencyObject child = VisualTreeHelper.GetChild(parent, i);

    if (child is TextBox)
        // Do something
}

Если вы хотите выполнить поиск в дереве, вам нужно будет выполнить этот цикл рекурсивно, например:

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;
    }
}
4
ответ дан Josh G 15 August 2018 в 22:48
поделиться
5
ответ дан Michaël Carpentier 15 August 2018 в 22:48
поделиться

Вы можете заставить обработчик исходного кода работать, зарегистрировав имя текстового поля:

someStackPanel.RegisterName(txtNumber.Name, txtNumber);

Это позволит вам вызвать FindName в StackPanel и найти TextBox.

4
ответ дан Josh G 15 August 2018 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: