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

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

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

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

3690閲覧

C#のWPFアプリケーションでTextBlockを配列のように切り替えたい。

suimi

総合スコア8

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/01/23 09:19

###前提・実現したいこと
C#のWPFアプリケーションで、TextBlockをMainWindow.xamlの中に定義してあります。このTextBlockは名前がTextBlock1,TextBlock2・・・
という感じで複数定義してあるのですが、これらをTextBlock[変数名].Textみたいな配列で切り替えて表示させたいです。

###発生している問題・エラーメッセージ

今現在は配列のように書けてないので TextBlock1.Text=???; で書いています。この1の部分を変数で置き換えてfor分の中に入れたいです。

###該当のソースコード

C#

1using System; 2using System.Windows; 3using System.Windows.Data; 4using System.Windows.Documents; 5using System.Windows.Input; 6using System.Windows.Media; 7using System.Windows.Media.Imaging; 8using System.Windows.Navigation; 9using System.Windows.Shapes; 10 11namespace Muse 12{ 13 /// <summary> 14 /// MainWindow.xaml の相互作用ロジック 15 /// </summary> 16 public partial class MainWindow : Window 17 { 18 int x = 0, y = 200; 19 x = 3 * y; 20 21 public MainWindow() 22 { 23 InitializeComponent(); 24 } 25 26 private void Button_Click_1(object sender,RoutedEventArgs e) 27 { 28 TectBlock1.Text=x.ToString(); 29/*使いたいイメージ 30for(int i=0;i<3;i++) 31{ 32TextBlock[i]=~作成中~ 33} 34という感じで。 35*/ 36 } 37 } 38}

###試したこと
using System.Windows.Forms;
を宣言し、TextBoxとかTextBlockが型として宣言できるようになった。
が、その後の使い方といいますか表示方法が分からずに前回のものに戻ってきた。

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2013とVisual Studio 2015の両方を使用中

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

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

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

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

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

guest

回答2

0

質問に対する回答ではありませんが、何となくやろうとしていることがDataGridっぽいので、目的に合えば、多分楽ができるかと思います。

参考までに、こことかこことか、WPF DataGridで検索すれば他にも色々。

見当違いであれば、スルーして下さい。

投稿2018/01/24 07:58

sazi

総合スコア25173

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

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

0

ベストアンサー

Xaml

XML

1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="350" Width="525"> 9 <Grid Margin="20"> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="Auto"/> 12 <RowDefinition Height="Auto"/> 13 <RowDefinition Height="Auto"/> 14 <RowDefinition/> 15 <RowDefinition Height="Auto"/> 16 </Grid.RowDefinitions> 17 <TextBlock Grid.Row="0" Name="TextBlock01"/> 18 <TextBlock Grid.Row="1" Name="TextBlock02"/> 19 <TextBlock Grid.Row="2" Name="TextBlock03"/> 20 <Button Grid.Row="4" Width="90" Height="21" Click="Button_Click">Click me!</Button> 21 </Grid> 22</Window>

コードビハインド

C#

1using System.Collections.Generic; 2using System.Linq; 3using System.Text.RegularExpressions; 4using System.Windows; 5using System.Windows.Controls; 6 7namespace WpfApp1 8{ 9 public partial class MainWindow : Window 10 { 11 private IList<TextBlock> textBlocks; 12 13 private IEnumerable<TextBlock> FindTextBlocks(DependencyObject parent) 14 { 15 foreach (var child in LogicalTreeHelper.GetChildren(parent).OfType<DependencyObject>()) 16 { 17 var textBlock = child as TextBlock; 18 if (textBlock != null) yield return textBlock; 19 else foreach (var grandchild in FindTextBlocks(child)) yield return grandchild; 20 } 21 } 22 23 public MainWindow() 24 { 25 InitializeComponent(); 26 textBlocks = FindTextBlocks(this) 27 .Where(a => Regex.IsMatch(a.Name, @"TextBlock[\d]+")) 28 .OrderBy(a => a.Name) 29 .ToList(); 30 } 31 32 private void Button_Click(object sender, RoutedEventArgs e) 33 { 34 foreach (var textBlock in textBlocks) 35 { 36 textBlock.Text = "I am " + textBlock.Name; 37 } 38 } 39 } 40} 41

投稿2018/01/23 14:06

Zuishin

総合スコア28660

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

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

suimi

2018/01/23 22:02

解答ありがとうございます. 一つだけ疑問が残ったのでコメントさせていただくことにしました. TextBlockを150個ほど作ってデータ整理をするつもりなのですが ボタンクリックで動作する部分の中身 foreach (var textBlock in textBlocks) { textBlock.Text = "I am " + textBlock.Name; } において,TectBlock50からTextBlock80の間だけにアクセスするなど,範囲に制限をかけるにはどう書けば良いでしょうか. お願いします.
Zuishin

2018/01/23 23:53

そのために Where 部分をサンプルとして入れています。好きなように選択できます。
Zuishin

2018/01/23 23:58

具体的には IsMatch を Match に変更して正規表現で数値部分を取り出し、それを int に変換してその大小でフィルタリングすればいいです。 今は単純に一つのラムダ式で済ませていますが、切り出してメソッドにすると書きやすいと思います。
Zuishin

2018/01/24 00:28 編集

//Where を次のように変更 Where(a => FilterByName(a.Name)) //次のようなメソッドを作る private bool FilterByName(string name) { // name の数値部分が 50~80 なら true を、それ以外なら false を返す }
suimi

2018/01/24 11:15

すいません。いろいろ試してはみたのですが、nameの数値を50~80でにうまく入力できなかったです。 Whereも調べて考えましたが、正解がわからなかったです。 別で質問を新たに作成するので数値の制限範囲をかける場合のプログラムを載せていただけるとありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問