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

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

新規登録して質問してみよう
ただいま回答率
85.35%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

WPF

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

Q&A

解決済

2回答

7372閲覧

[WPF DataGrid] ヘッダー・行を動的に追加したい

TEC_S

総合スコア79

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

WPF

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

0グッド

0クリップ

投稿2021/06/13 01:49

編集2021/06/13 02:02

前提・実現したいこと

WPFで、ファイル管理に関するシステムを作っています。
ファイルに対するコメントを残したいので(しかもコメント数も動的に変更させたい)、動的にヘッダーを追加して、行も追加していく仕組みにしたく、実装しています。

動的にヘッダー、行を追加できるようにはなったものの、意図しない文字列が入ってくる問題が発生しており、困っています。
この実装方法が良いのかどうかも、怪しいとは感じています。よろしくお願いいたします。

発生している問題

コメント1のところに意図しない文字列が入っている。
意図しているのは、「"コメント1へのコメント"」の文字列がコメント1に入ってくる事です。
DataGridViewOrTab.orgFileInfoは、クラス名ですが、リストには追加するようになっていないと認識しています。
なぜ、、、追加されてしまうのか不明です。(調査したが、出てこない)

イメージ説明

該当のソースコード

XAML

1<Window x:Class="DataGridViewOrTab.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:DataGridViewOrTab" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="475.449" Width="800"> 9 <Grid> 10 <TabControl Height="410" VerticalAlignment="Top"> 11 <TabItem Header="対象フォルダ1"> 12 <DataGrid Name="forder1DataGrid" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" Height="auto"> 13 <DataGrid.Columns> 14 <DataGridTemplateColumn Header="確認"> 15 <DataGridTemplateColumn.CellTemplate> 16 <DataTemplate> 17 <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" Click="folder1_click" /> 18 </DataTemplate> 19 </DataGridTemplateColumn.CellTemplate> 20 </DataGridTemplateColumn> 21 <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}"> 22 <DataGridTextColumn.CellStyle> 23 <Style TargetType="DataGridCell"> 24 <Setter Property="Foreground" Value="{Binding ForeColor}"/> 25 </Style> 26 </DataGridTextColumn.CellStyle> 27 </DataGridTextColumn> 28 <DataGridTextColumn Header="備考" Binding="{Binding Comment}"> 29 <DataGridTextColumn.CellStyle> 30 <Style TargetType="DataGridCell"> 31 <Setter Property="Foreground" Value="{Binding ForeColor}"/> 32 </Style> 33 </DataGridTextColumn.CellStyle> 34 </DataGridTextColumn> 35 <!--<DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" Foreground="{Binding ForeColor}" />--> 36 <!--<DataGridTextColumn Header="備考" Binding="{Binding Comment}" />--> 37 </DataGrid.Columns> 38 </DataGrid> 39 </TabItem> 40 <TabItem Header="対象フォルダ2"> 41 <DataGrid Name="forder2DataGrid" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" Height="auto"> 42 <DataGrid.Columns> 43 <DataGridTemplateColumn Header="確認"> 44 <DataGridTemplateColumn.CellTemplate> 45 <DataTemplate> 46 <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 47 </DataTemplate> 48 </DataGridTemplateColumn.CellTemplate> 49 </DataGridTemplateColumn> 50 <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" /> 51 <DataGridTextColumn Header="備考" Binding="{Binding Comment}" /> 52 </DataGrid.Columns> 53 </DataGrid> 54 </TabItem> 55 </TabControl> 56 <Button x:Name="DataUpdata" Content="データ更新" HorizontalAlignment="Left" Margin="10,415,0,0" VerticalAlignment="Center" Width="75" RenderTransformOrigin="1.202,0.058" Height="29" Click="DataUpdata_click"/> 57 </Grid> 58</Window> 59

C#

1using System.Collections.Generic; 2using System.Linq; 3using System.Windows; 4using System.Windows.Controls; 5using System.Windows.Media; 6using System.Diagnostics; 7 8using System.Collections.ObjectModel; 9 10namespace DataGridViewOrTab 11{ 12 /// <summary> 13 /// MainWindow.xaml の相互作用ロジック 14 /// </summary> 15 public partial class MainWindow : Window 16 { 17 18 private List<orgFileInfo> orgFileList = new List<orgFileInfo>(); 19 private orgFileInfo _orgFileInfo = new orgFileInfo(); 20 21 public MainWindow() 22 { 23 InitializeComponent(); 24 25 //ヘッダー 26 CreateHeader(); 27 CreateRowList(); 28 } 29 30 private void CreateHeader() 31 { 32 for(int i =0; i < 5; i++) 33 { 34 var colum = new DataGridTextColumn(); 35 colum.Header = "コメント" + (i + 1); 36 colum.Binding = new System.Windows.Data.Binding($"[{i}]"); 37 38 forder1DataGrid.Columns.Add(colum); 39 } 40 } 41 42 private void CreateRowList() 43 { 44 var dataList = new ObservableCollection<List<object>>(); 45 46 for (int i=0; i<5; i++) 47 { 48 List<object> row_data = new List<object>(); 49 row_data.Add(new orgFileInfo { FileName = "FileName" + (i+1), Comment = "Comment" + (i+1), ForeColor = new SolidColorBrush(Color.FromRgb(0, 0, 0)) }); 50 row_data.Add("コメント1へのコメント"); 51 row_data.Add("コメント2へのコメント"); 52 row_data.Add("コメント3へのコメント"); 53 row_data.Add("コメント4へのコメント"); 54 55 dataList.Add(row_data); 56 } 57 58 forder1DataGrid.ItemsSource = dataList; 59 } 60 61 private void LeadFolder1List() 62 { 63 forder1DataGrid.Items.Clear(); 64 } 65 66 private void folder1_click(object sender, RoutedEventArgs e) 67 { 68 //ここでクリックしたデータグリッドのDataContextを取得したい... 69 70 if (sender is CheckBox checkBox) 71 { 72 if (checkBox.DataContext is orgFileInfo info) 73 { 74 Debug.WriteLine("IsChecked:" + info.IsChecked); 75 Debug.WriteLine("FileName:" + info.FileName); 76 Debug.WriteLine("Comment:" + info.Comment); 77 //Debug.WriteLine(""); 78 79 updataLocalList(info); 80 } 81 } 82 } 83 84 /// <summary> 85 /// DataGridの更新 86 /// </summary> 87 /// <param name="getNowList"></param> 88 private void updataLocalList(orgFileInfo getNowList) 89 { 90 //リストの値を更新する 91 for (int counter = 0; counter < orgFileList.Count; counter++) 92 { 93 if (orgFileList.ElementAt(counter).FileName == getNowList.FileName) 94 { 95 orgFileList.ElementAt(counter).IsChecked = getNowList.IsChecked; 96 Debug.WriteLine("IsChecked changed" + orgFileList.ElementAt(counter).IsChecked); 97 } 98 else 99 { 100 orgFileList.ElementAt(counter).IsChecked = false; 101 } 102 } 103 104 forder1DataGrid.ItemsSource = null; 105 forder1DataGrid.ItemsSource = orgFileList; 106 //Debug.WriteLine("forder1DataGrid ItemsSource changed"); 107 } 108 109 110 private void DataUpdata_click(object sender, RoutedEventArgs e) 111 { 112 } 113 } 114 115 class orgFileInfo 116 { 117 public bool IsChecked { get; set; } 118 public string FileName { get; set; } 119 public string Comment { get; set; } 120 public SolidColorBrush ForeColor { get; set; } 121 } 122} 123

試したこと

1)下記を参考に実装
https://hyperts.net/wpf-datagrid/

2)行を作成する際に、違うものが入ってきたりするため、Object型にして色々受けれるようにした

補足情報(FW/ツールのバージョンなど)

Windows10
Visual Studio2019 / .NET4.72

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

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

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

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

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

KoichiSugiyama

2021/06/13 01:56

コメント1にはどういう内容を表示するのが意図した結果なのか、も追記していただいた方が、指摘が集まりやすいと思います。
TEC_S

2021/06/13 01:58

アドバイスありがとうございます。 承知しました。修正させて頂きます。
ebiryo

2021/06/14 04:04

「コメント5」には何が表示される想定ですか?
TN8001

2021/06/14 09:32

KoichiSugiyamaさんの返信次第で回答しようかと思っていましたが、ほかで質問されたようですね。。 [WPF DataGridへの動的な列と行(行は特定の型ではない)の追加](https://social.msdn.microsoft.com/Forums/ja-JP/39d1bb5c-961e-4492-8991-e3782d997757/wpf12288datagrid12408123982120530340123942101512392348923489212399?forum=csharpgeneralja ヘルプにあるように推奨しないだけでしてもかまいませんが、解決したならその旨書いてクローズしてください。不誠実です。 > 他のサービスにも質問投稿をしたい(してしまった) > teratailでは、マルチポスト※の推奨はしていません。 > やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。 > ※「マルチポスト」とは、同じ内容の文章を複数のQ&Aサイトや掲示板などへ投稿することです。 [ヘルプ|teratail(テラテイル)](https://teratail.com/help#posted-otherservice
TEC_S

2021/06/16 02:37

申し訳ありませんでした。 解決済みにさせて頂きました。
guest

回答2

0

自己解決

マルチポストにて解決しました。
色々やった後のコードなので、本件コードと違う部分が多々あります。

[WPF DataGridへの動的な列と行(行は特定の型ではない)の追加](https://social.msdn.microsoft.com/Forums/ja-JP/39d1bb5c-961e-4492-8991-e3782d997757/wpf12288datagrid12408123982120530340123942101512392348923489212399?forum=csharpgeneralja

本件のコードに反映したものが下記です。

C#

1using System.Collections.Generic; 2using System.Linq; 3using System.Windows; 4using System.Windows.Controls; 5using System.Windows.Media; 6using System.Diagnostics; 7 8using System.Collections.ObjectModel; 9 10using System.ComponentModel; 11using System.Runtime.CompilerServices; 12 13namespace DataGridViewOrTab 14{ 15 /// <summary> 16 /// MainWindow.xaml の相互作用ロジック 17 /// </summary> 18 public partial class MainWindow : Window 19 { 20 21 private List<orgFileInfo> orgFileList = new List<orgFileInfo>(); 22 private orgFileInfo _orgFileInfo = new orgFileInfo(); 23 24 private ObservableCollection<object> ItemCollection = new ObservableCollection<object>(); 25 26 public MainWindow() 27 { 28 InitializeComponent(); 29 30 //ヘッダー 31 CreateHeader(); 32 CreateRowList(); 33 } 34 35 private void CreateHeader() 36 { 37 for(int i =0; i < 5 ; i++) 38 { 39 var colum = new DataGridTextColumn(); 40 colum.Header = "コメント" + (i + 1); 41 colum.Binding = new System.Windows.Data.Binding($"Comments[{i}]"); 42 43 forder1DataGrid.Columns.Add(colum); 44 } 45 } 46 47 private void CreateRowList() 48 { 49 var dataList = new ObservableCollection<List<object>>(); 50 for (int i=0; i<5; i++) 51 { 52 //ObservableCollection<object> row_data = new ObservableCollection<object>(); 53 //変更 54 orgFileInfo row_data = new orgFileInfo { FileName = "FileName" + (i + 1), Comment = "Comment" + (i + 1), ForeColor = new SolidColorBrush(Color.FromRgb(0, 0, 0)) }; 55 56 row_data.Comments.Add("コメント1へのコメント"); 57 row_data.Comments.Add("コメント2へのコメント"); 58 row_data.Comments.Add("コメント3へのコメント"); 59 row_data.Comments.Add("コメント4へのコメント"); 60 row_data.Comments.Add("コメント5へのコメント"); 61 62 ItemCollection.Add(row_data); 63 } 64 forder1DataGrid.ItemsSource = ItemCollection; 65 66 } 67 } 68 69 70 class orgFileInfo 71 { 72 public bool IsChecked { get; set; } 73 public string FileName { get; set; } 74 public string Comment { get; set; } 75 public SolidColorBrush ForeColor { get; set; } 76 //このクラスにコメントを格納するコレクションのプロパティを追加する 77 public ObservableCollection<string> Comments { get; private set; } = new ObservableCollection<string>(); 78 } 79 80} 81

投稿2021/06/16 02:36

編集2021/06/16 02:39
TEC_S

総合スコア79

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

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

0

WPFはあまり触っていないので、外していたらすみません。

C#

1for (int i=0; i<5; i++) 2{ 3 4 List<object> row_data = new List<object>(); 5 row_data.Add(new orgFileInfo { FileName = "FileName" + (i+1), Comment = "Comment" + (i+1), ForeColor = new SolidColorBrush(Color.FromRgb(0, 0, 0)) }); 6 row_data.Add("コメント1へのコメント"); 7 row_data.Add("コメント2へのコメント"); 8 row_data.Add("コメント3へのコメント"); 9 row_data.Add("コメント4へのコメント"); 10 11 dataList.Add(row_data); 12}

このループ内の処理一番最初の

C#

1 row_data.Add(new orgFileInfo { FileName = "FileName" + (i+1), Comment = "Comment" + (i+1), ForeColor = new SolidColorBrush(Color.FromRgb(0, 0, 0)) });

で追加しているorgFileInfoクラスのメンバにSolidColorBrushのメンバがあり、これを表示用の文字列には変換できないため、オブジェクト名で表示しに行っているのだと思います。

投稿2021/06/13 02:24

KoichiSugiyama

総合スコア3041

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

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

TEC_S

2021/06/13 03:40

ご回答、ありがとうございます。 SolidColorBrushは、セルの色をコントロールするためにBindingしているため、行き場所がない・・・という事はなさそうです。試しに、SolidColorBrushを外してみましたが、症状は同じでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問