前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー