2011-07-21 16 views

答えて

4

これを試してみてください:

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

奇妙な方法。 'MyNamespace.TextBox'というタイプのものがあればどうなりますか? :-) – CodeNaked

+1

あなたのコードがちょっと違いますが、最後のコメントは[CA1800](http://msdn.microsoft.com/en-us/library/ms182271.aspx)に従うことです。 – CodeNaked

+1

これを行うより良い方法は、 'OfType' Linqメソッドを使うことです:' foreach(TextBox tb in myGrid.Children.OfType ()){} '。あるいは、型を直接比較するのではなく、 'as'演算子を使用します。これは継承をサポートしているためです。' var controlAsTextBox = control as TextBox; if(controlAsTextBox!= null){} ' –

3

論理。

グリッドは、コントロールを視覚的にに整理するのに役立ちます。レイアウトコンテナです。決してあなたのコントロールを整理するために使用されるべきではありません論理的に、舞台裏。

私が言ったように、これはかなり一般的なアドバイスです。あなたのプログラムは他のアプローチの恩恵を受けるかもしれません。

+0

また、LinqメソッドのOfTypeを使用することもできます:forech(TextBox tb in grid.Children.OfType ()){} '。 –

1

トムとCodeNakedはあなたがやりたいだろう与えたコードを、私はこれに対して、一般的にアドバイスをになります。このような何かがうまくいく

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

+1私はあなたに完全に同意しますが、依然として質問に答えたい –

1

この問題には複数のアプローチがあります。

第1のアプローチは、データフローをバインドによってテキストボックスに表示し、ボタンをクリックしてデータを削除するハイブリッドアプローチです。あなたと一緒に起動するには

は、データクラスがINotifyPropertyChangedを実装することを確認する必要があります。

バインディングを通して、あなたのXAMLで参照
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... 
} 

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

このアプローチは、より複雑なUIを処理するためのより良い方向にあなたを押し進めます。


土壇場の努力は次のようになります。タイプを決定するために

/// <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; 
    } 
} 
関連する問題