Очистить текст в нескольких TextBox одновременно - PullRequest
4 голосов
/ 22 июля 2011

У меня есть приложение WPF с Grid, где есть несколько TextBox с.Как я могу сделать каждый TextBox.Text = null; одним нажатием кнопки?

Ответы [ 4 ]

4 голосов
/ 22 июля 2011

Попробуйте:

   private void button1_Click(object sender, RoutedEventArgs e)
    {
        foreach (UIElement control in myGrid.Children)
        {
            if (control.GetType() == typeof(TextBox))
            {
                TextBox txtBox = (TextBox)control;
                txtBox.Text = null;
            }
        }
    }
3 голосов
/ 22 июля 2011

Примерно так будет работать:

private void Button_Click(object sender, RoutedEventArgs e) {
    foreach (UIElement element in this.grid.Children) {
        TextBox textBox = element as TextBox;
        if (textBox == null)
            continue;

        textBox.Text = null;
    }
}
1 голос
/ 22 июля 2011

Существует несколько подходов к этой проблеме.

Первый - это гибридный подход, при котором поток данных направляется в текстовые поля через привязки, а нажатие кнопки удаляет данные.

Для начала вам нужно убедиться, что ваши классы данных реализуют INotifyPropertyChanged:

public class Foo : INotifyPropertyChanged
{
    private string bar;
    private string baz;

    public string Bar
    {
        get { return this.bar; }
        set
        {
            this.bar = value;

            // this is where the magic of bindings happens
            this.OnPropertyChanged("Bar");
        }
    }

    // rest of the class here...
}

Ссылка в вашем XAML через привязки:

<Grid>
    <Grid.RowDefinitions>
        <!-- ... -->
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0"
             Text="{Binding Bar}" />
    <TextBox Grid.Row="1"
             Text="{Binding Baz}" />

    <!-- A more complete example would use Button.Command -->
    <Button Grid.Row="2"
            Content="CLEAR"
            Click="ClearButton_Click" />

Наконец,эти привязки подключаются с использованием DataContext и маршрутизируемого обработчика событий в вашем коде Window:

public Window1()
{
    this.InitializeComponent();

    // sets up the DataContext used by the bindings
    this.Clear();
}

private void ClearButton_Click(object sender, RoutedEventArgs e)
{
    this.Clear();
}

private void Clear()
{
    this.DataContext = new Foo();
}

Этот подход поможет вам лучше ориентироваться в более сложных интерфейсах.


Последнее усилие в канаве будет:

/// <summary>This is a bad choice.</summary>
private void ClearButton_Click(object sender, RoutedEventArgs e)
{
    // assumes the Grid is named MyGrid
    foreach (var textBox in this.MyGrid.Children.OfType<TextBox>())
    {
        textBox.Text = null;
    }
}
1 голос
/ 22 июля 2011

Код, который дал Том и CodeNaked, будет делать то, что вы хотите, но я бы обычно советовал против этой логики.

Сетка поможет вам организовать ваши элементы управления визуально, это контейнер макета .Это ни в коем случае не должно использоваться для организации ваших элементов управления логически , за кулисами.

Как я уже сказал, это довольно общий совет.Ваша программа может выиграть от другого подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...