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

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

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

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

Q&A

解決済

2回答

3241閲覧

WPF 同一の値を持つ隣接セルをマージしたい

01k-t

総合スコア9

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

0グッド

0クリップ

投稿2018/10/16 09:50

編集2018/10/16 11:05

WPFアプリケーションの開発をしています。

同一の値を持つ隣接セルをマージ(行方向)する方法についてご教授頂きたいです。
実現のための方法、その他アドバイス等頂けると幸いです。

試したこと

下記サイトを参考に、マージを行う列はグループ化で実装できるのではないかと試しております。
https://stackoverflow.com/questions/23988232/vertical-grouping-wpf-datagrid-or-listview

実現したいこと

下記図のような表示をさせたいです。
参考

参考サイトから追加で実現したい内容
・グループ化した項目のヘッダを表示させたい
・グループ化した項目に対してもデータによって表示方法を変更したい
(項目の値によって表示フォーマットを変える、数値なら右寄せ等)

下記コードではState、Term、Rateの3つのプロパティ名でグループ化しています。
グループ化した項目に対しての、見た目の制御方法が分らず、ご教授頂きたいです。

###該当コード

XAML

1<Grid> 2 <DataGrid ItemsSource="{Binding TotalDatas}" 3 AutoGenerateColumns="False" 4 CanUserAddRows="False" 5 CanUserDeleteRows="False" 6 SelectionMode="Single" 7 FontSize="18"> 8 <DataGrid.GroupStyle> 9 <GroupStyle> 10 <GroupStyle.ContainerStyle> 11 <Style TargetType="{x:Type GroupItem}"> 12 <Setter Property="Template"> 13 <Setter.Value> 14 <ControlTemplate TargetType="{x:Type GroupItem}"> 15 <Grid> 16 <Grid.ColumnDefinitions> 17 <ColumnDefinition Width="auto" /> 18 <ColumnDefinition /> 19 </Grid.ColumnDefinitions> 20 <Border BorderBrush="Black" BorderThickness=".5" Padding="4"> 21 <TextBlock Text="{Binding Name}" VerticalAlignment="Center" /> 22 </Border> 23 <ItemsPresenter Grid.Column="1" /> 24 </Grid> 25 </ControlTemplate> 26 </Setter.Value> 27 </Setter> 28 </Style> 29 </GroupStyle.ContainerStyle> 30 </GroupStyle> 31 </DataGrid.GroupStyle> 32 <DataGrid.Columns> 33 <DataGridTextColumn Header="状態" Binding="{Binding State}" Width="Auto" IsReadOnly="True"> 34 <DataGridTextColumn.CellStyle> 35 <Style TargetType="{x:Type DataGridCell}"> 36 <Setter Property="Background" Value="{Binding Path=StateColor}"></Setter> 37 </Style> 38 </DataGridTextColumn.CellStyle> 39 </DataGridTextColumn> 40 <DataGridTextColumn Header="時間(分)" Binding="{Binding Term.TotalMinutes, Mode=OneWay, StringFormat=\{0:F\}}" Width="Auto"> 41 <DataGridTextColumn.CellStyle> 42 <Style TargetType="{x:Type DataGridCell}"> 43 <Setter Property="HorizontalAlignment" Value="Right"/> 44 </Style> 45 </DataGridTextColumn.CellStyle> 46 </DataGridTextColumn> 47 <DataGridTextColumn Header="割合" Binding="{Binding Rate, StringFormat=\{0:P\}}" Width="auto" IsReadOnly="True"></DataGridTextColumn> 48 <DataGridTextColumn Header="内訳" Binding="{Binding ChildItem1}" Width="Auto" IsReadOnly="True"> 49 <DataGridTextColumn.CellStyle> 50 <Style TargetType="{x:Type DataGridCell}"> 51 <Setter Property="Background" Value="{Binding Path=ChildStateColor}"></Setter> 52 </Style> 53 </DataGridTextColumn.CellStyle> 54 </DataGridTextColumn> 55 <DataGridTextColumn Header="内訳2" Binding="{Binding ChildItem2}" Width="Auto" IsReadOnly="True"> 56 <DataGridTextColumn.CellStyle> 57 <Style TargetType="{x:Type DataGridCell}"> 58 <Setter Property="Background" Value="{Binding Path=ChildStateColor}"></Setter> 59 </Style> 60 </DataGridTextColumn.CellStyle> 61 </DataGridTextColumn> 62 </DataGrid.Columns> 63 </DataGrid> 64 </Grid>

グループ化部分抜粋

VB

1 Dim tmpView As CollectionView = CType(CollectionViewSource.GetDefaultView(Me._TotalDatas), CollectionView) 2 tmpView.GroupDescriptions.Add(New PropertyGroupDescription("State")) 3 tmpView.GroupDescriptions.Add(New PropertyGroupDescription("Term")) 4 tmpView.GroupDescriptions.Add(New PropertyGroupDescription("Rate"))

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

.NET Framework 4
Livet
VB.net

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

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

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

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

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

hihijiji

2018/10/16 10:05

下記サイト通りでは何がだめなのですか?
01k-t

2018/10/16 11:05

ご投稿頂きありがとうございます。参考サイトから追加で実現したい内容を追記編集致しました。
guest

回答2

0

ベストアンサー

色々試してみましたが、その結果わかったことがあります。
紹介されている方法はセルをマージするものではありません。
セルを無くし、代わりにグループに応じた図形を描くものです。

リンク先ではきれいに描かれていますが、それはセル(っぽいもの)の中の文字数が揃っているからで、文字数がバラバラだったり全角が混ざってたりフォントによってはガタガタになります。

カラムヘッダがないのはセルでないからです。カラムの外側です。

きれいに描くことは頑張ればできなくもありませんが、それは既に DataGrid ではありません。
一から新しいコントロールを作った方がマシだという結論に至りました。

ということで、新しいコントロールを作るかサードパーティーのものを探してください。

投稿2018/10/16 22:38

Zuishin

総合スコア28660

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

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

01k-t

2018/10/16 23:18

ご回答ありがとうございます。 また色々お試しいただきありがとうございました。 実現の方法を再検討します。
guest

0

高度なDataGridは、サードパーティーのお高いものを買わないとだめなような気がします。
買ったことないので、よくわかりませんが。

例えばここ。
https://www.grapecity.co.jp/developer/controls/wpf/datagrid
すごい機能として、行と列のマージが紹介されているので、難しいのじゃないかな・・

お金持ちなら、買って、サポートに質問しよう。
お金使いたくないなら、ItemsControlで頑張ろう。

・グループ化した項目のヘッダを表示させたい

適当に、Gridや、StackPanelを使って、自分で書けばいいじゃない。
WPFは、隙間なく描画できますよ。

・グループ化した項目に対してもデータによって表示方法を変更したい

(項目の値によって表示フォーマットを変える、数値なら右寄せ等)

     <ItemsControl.ItemTemplate> <DataTemplate> <Border BorderBrush="Black" BorderThickness=".5" Padding="4"> <TextBlock Text="{Binding Data}" /> </Border> </DataTemplate> </ItemsControl.ItemTemplate>

手本のここを何とかする。

投稿2018/10/16 14:40

編集2018/10/16 14:59
kiichi54321

総合スコア1984

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

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

01k-t

2018/10/16 23:18

ご回答ありがとうございます。 実現の方法を再検討します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問