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

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

ただいまの
回答率

87.48%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 411

score 56

前提・実現したいこと

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

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

発生している問題

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

イメージ説明

該当のソースコード

<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>
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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ebiryo

    2021/06/14 13:04

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

    キャンセル

  • TN8001

    2021/06/14 18: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 11:37

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

    キャンセル

回答 2

check解決した方法

+1

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

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

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

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;

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace DataGridViewOrTab
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {

        private List<orgFileInfo> orgFileList = new List<orgFileInfo>();
        private orgFileInfo _orgFileInfo = new orgFileInfo();

        private ObservableCollection<object> ItemCollection = new ObservableCollection<object>();

        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($"Comments[{i}]");

                forder1DataGrid.Columns.Add(colum);
            }
        }

        private void CreateRowList()
        {
            var dataList = new ObservableCollection<List<object>>();
            for (int i=0; i<5; i++)
            {
                //ObservableCollection<object> row_data = new ObservableCollection<object>();
                //変更
                orgFileInfo row_data = new orgFileInfo { FileName = "FileName" + (i + 1), Comment = "Comment" + (i + 1), ForeColor = new SolidColorBrush(Color.FromRgb(0, 0, 0)) };

                row_data.Comments.Add("コメント1へのコメント");
                row_data.Comments.Add("コメント2へのコメント");
                row_data.Comments.Add("コメント3へのコメント");
                row_data.Comments.Add("コメント4へのコメント");
                row_data.Comments.Add("コメント5へのコメント");

                ItemCollection.Add(row_data);
            }            
            forder1DataGrid.ItemsSource = ItemCollection;

        }
    }


    class orgFileInfo
    {
        public bool IsChecked { get; set; }
        public string FileName { get; set; }
        public string Comment { get; set; }
        public SolidColorBrush ForeColor { get; set; }
        //このクラスにコメントを格納するコレクションのプロパティを追加する
        public ObservableCollection<string> Comments { get; private set; } = new ObservableCollection<string>();
    }

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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);
}


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

    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 12:40

    ご回答、ありがとうございます。

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

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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