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

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

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

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

WPF

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

解決済

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

TEC_S
TEC_S

総合スコア79

DataGrid

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

WPF

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

2回答

0リアクション

0クリップ

3229閲覧

投稿2021/06/13 01:49

編集2021/06/13 02:02

前提・実現したいこと

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

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

発生している問題

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

イメージ説明

該当のソースコード

XAML

<Window x:Class="DataGridViewOrTab.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DataGridViewOrTab" mc:Ignorable="d" Title="MainWindow" Height="475.449" Width="800"> <Grid> <TabControl Height="410" VerticalAlignment="Top"> <TabItem Header="対象フォルダ1"> <DataGrid Name="forder1DataGrid" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" Height="auto"> <DataGrid.Columns> <DataGridTemplateColumn Header="確認"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" Click="folder1_click" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="Foreground" Value="{Binding ForeColor}"/> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridTextColumn Header="備考" Binding="{Binding Comment}"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="Foreground" Value="{Binding ForeColor}"/> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <!--<DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" Foreground="{Binding ForeColor}" />--> <!--<DataGridTextColumn Header="備考" Binding="{Binding Comment}" />--> </DataGrid.Columns> </DataGrid> </TabItem> <TabItem Header="対象フォルダ2"> <DataGrid Name="forder2DataGrid" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" Height="auto"> <DataGrid.Columns> <DataGridTemplateColumn Header="確認"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" /> <DataGridTextColumn Header="備考" Binding="{Binding Comment}" /> </DataGrid.Columns> </DataGrid> </TabItem> </TabControl> <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"/> </Grid> </Window>

C#

using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Diagnostics; using System.Collections.ObjectModel; namespace DataGridViewOrTab { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { private List<orgFileInfo> orgFileList = new List<orgFileInfo>(); private orgFileInfo _orgFileInfo = new orgFileInfo(); public MainWindow() { InitializeComponent(); //ヘッダー CreateHeader(); CreateRowList(); } private void CreateHeader() { for(int i =0; i < 5; i++) { var colum = new DataGridTextColumn(); colum.Header = "コメント" + (i + 1); colum.Binding = new System.Windows.Data.Binding($"[{i}]"); forder1DataGrid.Columns.Add(colum); } } private void CreateRowList() { var dataList = new ObservableCollection<List<object>>(); for (int i=0; i<5; i++) { List<object> row_data = new List<object>(); row_data.Add(new orgFileInfo { FileName = "FileName" + (i+1), Comment = "Comment" + (i+1), ForeColor = new SolidColorBrush(Color.FromRgb(0, 0, 0)) }); row_data.Add("コメント1へのコメント"); row_data.Add("コメント2へのコメント"); row_data.Add("コメント3へのコメント"); row_data.Add("コメント4へのコメント"); dataList.Add(row_data); } forder1DataGrid.ItemsSource = dataList; } private void LeadFolder1List() { forder1DataGrid.Items.Clear(); } private void folder1_click(object sender, RoutedEventArgs e) { //ここでクリックしたデータグリッドのDataContextを取得したい... if (sender is CheckBox checkBox) { if (checkBox.DataContext is orgFileInfo info) { Debug.WriteLine("IsChecked:" + info.IsChecked); Debug.WriteLine("FileName:" + info.FileName); Debug.WriteLine("Comment:" + info.Comment); //Debug.WriteLine(""); updataLocalList(info); } } } /// <summary> /// DataGridの更新 /// </summary> /// <param name="getNowList"></param> private void updataLocalList(orgFileInfo getNowList) { //リストの値を更新する for (int counter = 0; counter < orgFileList.Count; counter++) { if (orgFileList.ElementAt(counter).FileName == getNowList.FileName) { orgFileList.ElementAt(counter).IsChecked = getNowList.IsChecked; Debug.WriteLine("IsChecked changed" + orgFileList.ElementAt(counter).IsChecked); } else { orgFileList.ElementAt(counter).IsChecked = false; } } forder1DataGrid.ItemsSource = null; forder1DataGrid.ItemsSource = orgFileList; //Debug.WriteLine("forder1DataGrid ItemsSource changed"); } private void DataUpdata_click(object sender, RoutedEventArgs e) { } } class orgFileInfo { public bool IsChecked { get; set; } public string FileName { get; set; } public string Comment { get; set; } public SolidColorBrush ForeColor { get; set; } } }

試したこと

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

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

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

Windows10
Visual Studio2019 / .NET4.72

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

DataGrid

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

WPF

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