2011-07-21 4 views

Répondre

4

pour cette solution:

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; 
      } 
     } 
    } 
+1

Étrange façon de déterminer le type. Que faire si j'ai un type appelé 'MyNamespace.TextBox'? :-) – CodeNaked

+1

Ok, donc le dernier commentaire serait de suivre [CA1800] (http://msdn.microsoft.com/en-us/library/ms182271.aspx) même si votre code est un peu diff. – CodeNaked

+1

Une meilleure façon de le faire serait d'utiliser la méthode Linq 'OfType':' foreach (TextBox tb dans myGrid.Children.OfType ()) {} '. Ou, utilisez l'opérateur 'as ', au lieu de comparer directement les types, car il prend en charge l'héritage:' var controlAsTextBox = control as TextBox; if (controlAsTextBox! = null) {} '. –

3

Quelque chose comme ça marcherait:

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; 
    } 
} 
+0

Vous pouvez également utiliser la méthode Linq, 'OfType':' forech (TextBox tb dans grid.Children.OfType ()) {} '. –

1

Le code Tom et CodeNaked a donné fera ce que vous voulez, mais je généralement conseils contre cette logique.

La grille est là pour vous aider à organiser vos commandes visuellement, il est un conteneur de présentation . En aucun cas, il devrait être utilisé pour organiser vos contrôles logiquement, dans les coulisses.

Comme je l'ai dit, cependant, c'est un conseil assez général. Votre programme pourrait bénéficier de l'autre approche.

+1

+1 Je suis entièrement d'accord avec vous, mais je voulais quand même répondre à la question –

1

Il existe plusieurs approches à ce problème.

La première est une approche hybride dans laquelle les données sont transférées vers vos zones de texte via des liaisons et un clic sur un bouton supprime les données.

Pour commencer, vous devez vous assurer que vos classes de données à mettre en œuvre 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... 
} 

Référencé dans votre XAML grâce à des liaisons:

<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" /> 

Enfin, ces liaisons sont câblés à l'aide du DataContext et un gestionnaire d'événement routé dans votre code-behind Window s:

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(); 
} 

Cette approche vous permettra de mieux gérer les interfaces utilisateur plus complexes.


Un dernier effort serait:

/// <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; 
    } 
} 
Questions connexes