質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

16415閲覧

複数のTextBoxに、配列から順番にテキストをいれたいです。

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/12/22 09:28

こんにちは。
Windows10でWPFのアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。

###前提・実現したいこと
xamlでgrid(x:Name=maingred)に複数のTextBoxをレイアウトし、そこに配列から順番にテキストをいれたいです。

###試したソースコード

C#

1string[] texts = new string[]{"01text", "02text"}; 2textBox1.Text = texts[0]; 3textBox2.Text = texts[1];

これは増えると大変そう。

C#

1string[] texts = new string[]{"01text", "02text"}; 2 3int counter=0; 4foreach(TextBox textbox in maingrid.Children){ 5if (textbox.Name == "textBox" + counter+1) 6 textbox.Text = texts[counter]; 7counter++; 8}

これを、foreachを使わずに書きたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038

インストールしているバージョン:Community

Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Bindingで実現する最小限のサンプルです。

XAML側

xml

1 <Grid x:Name="maingrid"> 2 <Grid.RowDefinitions> 3 <RowDefinition /> 4 <RowDefinition /> 5 <RowDefinition /> 6 </Grid.RowDefinitions> 7 <TextBox Grid.Row="0" Text="{Binding Texts[0], Mode=OneWay}" /> 8 <TextBox Grid.Row="1" Text="{Binding Texts[1], Mode=OneWay}" /> 9 <TextBox Grid.Row="2" Text="{Binding Texts[2], Mode=OneWay}" /> 10 </Grid>

cs側

C#

1public partial class MainWindow : Window 2{ 3 public MainWindow() 4 { 5 InitializeComponent(); 6 7 //GridのDataContextを設定 8 this.maingrid.DataContext = new GridContext(); 9 } 10} 11 12public class GridContext 13{ 14 public string[] Texts { get; private set; } 15 16 public GridContext() 17 { 18 this.Texts = new[] { "01text", "02text", "03text" }; 19 } 20} 21
  • DataContextはTextBox自体に設定することも、上位のWindowに設定することもできます。

(より下位のものが優先されます。この例では TextBox > Grid > Window )


  • 上のサンプルでは、DataContext設定時に、1回限り、配列の内容がTextBoxに反映されます。

その後もTextsプロパティが変わる度にTextBoxへ自動反映したい場合は、
DataContextとなっているオブジェクト側でINotifyPropertyChangedを実装し、
プロパティの変更を画面へ通知してやる必要があります。
これも一応サンプル載せておきます。

C#

1public class GridContext : INotifyPropertyChanged 2{ 3 public event PropertyChangedEventHandler PropertyChanged; 4 5 private string[] _texts; 6 7 public string[] Texts 8 { 9 get 10 { 11 return _texts; 12 } 13 private set 14 { 15 _texts = value; 16 17 //画面への更新通知 18 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Texts))); 19 } 20 } 21 22 public GridContext() 23 { 24 this.Texts = new[] { "01text", "02text", "03text" }; 25 } 26}
  • 若干ややこしいんですが、上記のように更新通知を実装した場合でも、配列の要素の変更は検知できません。

Textsプロパティを更新する場合は、 Texts[0] = hoge のようにせずに、配列自体をまるごと作り直す必要があります。
(あるいはObservableCollectionのようにINotifyCollectionChangedを実装したコレクションを使います)

  • TextBoxでの入力内容変更を配列側に反映したい場合は、Binding Modeを Mode=TwoWay に変更し、

プロパティ側のsetの private を削除します。

投稿2017/01/03 04:57

oika

総合スコア425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MVVM的アプローチで、ItemsControlから配列を表示するほうが簡単じゃないかな。

ここが参考になると思います。 Gridへのアイテムのバインド(WPF編)

投稿2016/12/22 10:04

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2016/12/27 02:00

ありがとうございます。 MVVM的アプローチはいい感じです。 ただ、TextBoxとtext(string[])をどうBindingしたらよいか、構築できませんでした。 いろいろtryしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問