質問するログイン新規登録

回答編集履歴

1

見直しキャンペーン中

2023/07/22 09:00

投稿

TN8001
TN8001

スコア10180

answer CHANGED
@@ -1,182 +1,182 @@
1
- 多段のカラムヘッダーがやりたいと仮定してちょっと考えてみました。
2
-
3
- * カラムサイズ変更・カラム入れ替えを禁止。
4
- * サイズは比率指定のみ(`DataGrid`自体のサイズは変わるが横スクロールバーが出ない状態)
5
- * 横スクロールバー常に非表示・縦スクロールバー常に表示
6
-
7
- という限定された条件なら、ヘッダーのみのダミー`DataGrid`を適当に積み重ねれば手軽に実現できますね(非常にバカバカしいですが^^;
8
-
9
- ```xaml
10
- <Window
11
- x:Class="Questions276512.MainWindow"
12
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
13
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
14
- xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
15
- xmlns:sys="clr-namespace:System;assembly=mscorlib"
16
- Width="800"
17
- Height="400">
18
- <Window.Resources>
19
- <!-- 特に意味はない xamlのみ縛り -->
20
- <collections:ArrayList x:Key="data">
21
- <collections:DictionaryEntry Key="仙台支店">
22
- <collections:DictionaryEntry.Value>
23
- <collections:ArrayList>
24
- <sys:Int32>1</sys:Int32>
25
- <sys:Int32>2</sys:Int32>
26
- <sys:Int32>3</sys:Int32>
27
- </collections:ArrayList>
28
- </collections:DictionaryEntry.Value>
29
- </collections:DictionaryEntry>
30
- <collections:DictionaryEntry Key="東京本店">
31
- <collections:DictionaryEntry.Value>
32
- <collections:ArrayList>
33
- <sys:Int32>10</sys:Int32>
34
- <sys:Int32>20</sys:Int32>
35
- <sys:Int32>30</sys:Int32>
36
- </collections:ArrayList>
37
- </collections:DictionaryEntry.Value>
38
- </collections:DictionaryEntry>
39
- </collections:ArrayList>
40
-
41
- <Style TargetType="DataGridColumnHeader">
42
- <Setter Property="HorizontalContentAlignment" Value="Center" />
43
- </Style>
44
- </Window.Resources>
45
-
46
- <Border
47
- Margin="10"
48
- BorderBrush="#FF688CAF"
49
- BorderThickness="1">
50
- <Grid>
51
- <Grid.RowDefinitions>
52
- <RowDefinition Height="Auto" />
53
- <RowDefinition Height="Auto" />
54
- <RowDefinition />
55
- </Grid.RowDefinitions>
56
-
57
- <!-- 偽ヘッダー1 -->
58
- <Grid Background="#FFF0F0F0">
59
- <Grid.ColumnDefinitions>
60
- <ColumnDefinition Width="Auto" />
61
- <ColumnDefinition />
62
- <ColumnDefinition Width="Auto" />
63
- </Grid.ColumnDefinitions>
64
- <Border Width="{Binding RowHeaderActualWidth, ElementName=datagrid1, Mode=OneWay}" Visibility="{Binding VerticalScrollBarVisibility, ElementName=datagrid1}" />
65
- <DataGrid
66
- Grid.Column="1"
67
- BorderThickness="0"
68
- CanUserReorderColumns="False"
69
- CanUserResizeColumns="False"
70
- CanUserSortColumns="False">
71
- <DataGrid.Columns>
72
- <DataGridTextColumn Width="*" Header="2020年度" />
73
- </DataGrid.Columns>
74
- </DataGrid>
75
- <ScrollBar Grid.Column="2" Visibility="Hidden" />
76
- </Grid>
77
-
78
- <!-- 偽ヘッダー2 -->
79
- <Grid Grid.Row="1" Background="#FFF0F0F0">
80
- <Grid.ColumnDefinitions>
81
- <ColumnDefinition Width="Auto" />
82
- <ColumnDefinition />
83
- <ColumnDefinition Width="Auto" />
84
- </Grid.ColumnDefinitions>
85
- <Border Width="{Binding RowHeaderActualWidth, ElementName=datagrid1, Mode=OneWay}" />
86
- <DataGrid
87
- Grid.Column="1"
88
- BorderThickness="0"
89
- CanUserReorderColumns="False"
90
- CanUserResizeColumns="False"
91
- CanUserSortColumns="False">
92
- <DataGrid.Columns>
93
- <DataGridTextColumn Width="*" Header="第一四半期" />
94
- <DataGridTextColumn Width="*" Header="第二四半期" />
95
- <DataGridTextColumn Width="*" Header="第三四半期" />
96
- <DataGridTextColumn Width="*" Header="第四四半期" />
97
- </DataGrid.Columns>
98
- </DataGrid>
99
- <ScrollBar Grid.Column="2" Visibility="Hidden" />
100
- </Grid>
101
-
102
- <!-- 本体 -->
103
- <DataGrid
104
- Name="datagrid1"
105
- Grid.Row="2"
106
- AutoGenerateColumns="False"
107
- BorderThickness="0"
108
- CanUserReorderColumns="False"
109
- CanUserResizeColumns="False"
110
- HeadersVisibility="All"
111
- HorizontalScrollBarVisibility="Disabled"
112
- ItemsSource="{StaticResource data}"
113
- VerticalScrollBarVisibility="Visible">
114
- <DataGrid.RowHeaderStyle>
115
- <Style TargetType="{x:Type DataGridRowHeader}">
116
- <Setter Property="Content" Value="{Binding Key}" />
117
- </Style>
118
- </DataGrid.RowHeaderStyle>
119
- <DataGrid.Columns>
120
- <DataGridTextColumn
121
- Width="*"
122
- Binding="{Binding Value[0]}"
123
- Header="4月" />
124
- <DataGridTextColumn
125
- Width="*"
126
- Binding="{Binding Value[1]}"
127
- Header="5月" />
128
- <DataGridTextColumn
129
- Width="*"
130
- Binding="{Binding Value[2]}"
131
- Header="6月" />
132
- <DataGridTextColumn
133
- Width="*"
134
- Binding="{Binding Value[3]}"
135
- Header="7月" />
136
- <DataGridTextColumn
137
- Width="*"
138
- Binding="{Binding Value[4]}"
139
- Header="8月" />
140
- <DataGridTextColumn
141
- Width="*"
142
- Binding="{Binding Value[5]}"
143
- Header="9月" />
144
- <DataGridTextColumn
145
- Width="*"
146
- Binding="{Binding Value[6]}"
147
- Header="10月" />
148
- <DataGridTextColumn
149
- Width="*"
150
- Binding="{Binding Value[7]}"
151
- Header="11月" />
152
- <DataGridTextColumn
153
- Width="*"
154
- Binding="{Binding Value[8]}"
155
- Header="12月" />
156
- <DataGridTextColumn
157
- Width="*"
158
- Binding="{Binding Value[9]}"
159
- Header="1月" />
160
- <DataGridTextColumn
161
- Width="*"
162
- Binding="{Binding Value[10]}"
163
- Header="2月" />
164
- <DataGridTextColumn
165
- Width="*"
166
- Binding="{Binding Value[11]}"
167
- Header="3月" />
168
- </DataGrid.Columns>
169
- </DataGrid>
170
- </Grid>
171
- </Border>
172
- </Window>
173
- ```
174
- 無駄にxamlのみ縛りしたのと見た目にこだわったので、少し長くなりましたがやってることは単純です。
175
- ![アプリ画像](5efd977c949a7ce7a888a70ef1b80e66.png)
176
-
177
- ---
178
-
179
- しかし個人的にはこれでは使う気になれないです^^;
180
- なんとかカラムサイズ変更だけは可能にしたいと思い、頑張っていたのですが`IMultiValueConverter`だけは書く必要がありますねぇ(上下のサイズ変更が追従する。ここまでは検証済み)
181
-
1
+ 多段のカラムヘッダーがやりたいと仮定してちょっと考えてみました。
2
+
3
+ * カラムサイズ変更・カラム入れ替えを禁止。
4
+ * サイズは比率指定のみ(`DataGrid`自体のサイズは変わるが横スクロールバーが出ない状態)
5
+ * 横スクロールバー常に非表示・縦スクロールバー常に表示
6
+
7
+ という限定された条件なら、ヘッダーのみのダミー`DataGrid`を適当に積み重ねれば手軽に実現できますね(非常にバカバカしいですが^^;
8
+
9
+ ```xml
10
+ <Window
11
+ x:Class="Questions276512.MainWindow"
12
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
13
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
14
+ xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
15
+ xmlns:sys="clr-namespace:System;assembly=mscorlib"
16
+ Width="800"
17
+ Height="400">
18
+ <Window.Resources>
19
+ <!-- 特に意味はない xamlのみ縛り -->
20
+ <collections:ArrayList x:Key="data">
21
+ <collections:DictionaryEntry Key="仙台支店">
22
+ <collections:DictionaryEntry.Value>
23
+ <collections:ArrayList>
24
+ <sys:Int32>1</sys:Int32>
25
+ <sys:Int32>2</sys:Int32>
26
+ <sys:Int32>3</sys:Int32>
27
+ </collections:ArrayList>
28
+ </collections:DictionaryEntry.Value>
29
+ </collections:DictionaryEntry>
30
+ <collections:DictionaryEntry Key="東京本店">
31
+ <collections:DictionaryEntry.Value>
32
+ <collections:ArrayList>
33
+ <sys:Int32>10</sys:Int32>
34
+ <sys:Int32>20</sys:Int32>
35
+ <sys:Int32>30</sys:Int32>
36
+ </collections:ArrayList>
37
+ </collections:DictionaryEntry.Value>
38
+ </collections:DictionaryEntry>
39
+ </collections:ArrayList>
40
+
41
+ <Style TargetType="DataGridColumnHeader">
42
+ <Setter Property="HorizontalContentAlignment" Value="Center" />
43
+ </Style>
44
+ </Window.Resources>
45
+
46
+ <Border
47
+ Margin="10"
48
+ BorderBrush="#FF688CAF"
49
+ BorderThickness="1">
50
+ <Grid>
51
+ <Grid.RowDefinitions>
52
+ <RowDefinition Height="Auto" />
53
+ <RowDefinition Height="Auto" />
54
+ <RowDefinition />
55
+ </Grid.RowDefinitions>
56
+
57
+ <!-- 偽ヘッダー1 -->
58
+ <Grid Background="#FFF0F0F0">
59
+ <Grid.ColumnDefinitions>
60
+ <ColumnDefinition Width="Auto" />
61
+ <ColumnDefinition />
62
+ <ColumnDefinition Width="Auto" />
63
+ </Grid.ColumnDefinitions>
64
+ <Border Width="{Binding RowHeaderActualWidth, ElementName=datagrid1, Mode=OneWay}" Visibility="{Binding VerticalScrollBarVisibility, ElementName=datagrid1}" />
65
+ <DataGrid
66
+ Grid.Column="1"
67
+ BorderThickness="0"
68
+ CanUserReorderColumns="False"
69
+ CanUserResizeColumns="False"
70
+ CanUserSortColumns="False">
71
+ <DataGrid.Columns>
72
+ <DataGridTextColumn Width="*" Header="2020年度" />
73
+ </DataGrid.Columns>
74
+ </DataGrid>
75
+ <ScrollBar Grid.Column="2" Visibility="Hidden" />
76
+ </Grid>
77
+
78
+ <!-- 偽ヘッダー2 -->
79
+ <Grid Grid.Row="1" Background="#FFF0F0F0">
80
+ <Grid.ColumnDefinitions>
81
+ <ColumnDefinition Width="Auto" />
82
+ <ColumnDefinition />
83
+ <ColumnDefinition Width="Auto" />
84
+ </Grid.ColumnDefinitions>
85
+ <Border Width="{Binding RowHeaderActualWidth, ElementName=datagrid1, Mode=OneWay}" />
86
+ <DataGrid
87
+ Grid.Column="1"
88
+ BorderThickness="0"
89
+ CanUserReorderColumns="False"
90
+ CanUserResizeColumns="False"
91
+ CanUserSortColumns="False">
92
+ <DataGrid.Columns>
93
+ <DataGridTextColumn Width="*" Header="第一四半期" />
94
+ <DataGridTextColumn Width="*" Header="第二四半期" />
95
+ <DataGridTextColumn Width="*" Header="第三四半期" />
96
+ <DataGridTextColumn Width="*" Header="第四四半期" />
97
+ </DataGrid.Columns>
98
+ </DataGrid>
99
+ <ScrollBar Grid.Column="2" Visibility="Hidden" />
100
+ </Grid>
101
+
102
+ <!-- 本体 -->
103
+ <DataGrid
104
+ Name="datagrid1"
105
+ Grid.Row="2"
106
+ AutoGenerateColumns="False"
107
+ BorderThickness="0"
108
+ CanUserReorderColumns="False"
109
+ CanUserResizeColumns="False"
110
+ HeadersVisibility="All"
111
+ HorizontalScrollBarVisibility="Disabled"
112
+ ItemsSource="{StaticResource data}"
113
+ VerticalScrollBarVisibility="Visible">
114
+ <DataGrid.RowHeaderStyle>
115
+ <Style TargetType="{x:Type DataGridRowHeader}">
116
+ <Setter Property="Content" Value="{Binding Key}" />
117
+ </Style>
118
+ </DataGrid.RowHeaderStyle>
119
+ <DataGrid.Columns>
120
+ <DataGridTextColumn
121
+ Width="*"
122
+ Binding="{Binding Value[0]}"
123
+ Header="4月" />
124
+ <DataGridTextColumn
125
+ Width="*"
126
+ Binding="{Binding Value[1]}"
127
+ Header="5月" />
128
+ <DataGridTextColumn
129
+ Width="*"
130
+ Binding="{Binding Value[2]}"
131
+ Header="6月" />
132
+ <DataGridTextColumn
133
+ Width="*"
134
+ Binding="{Binding Value[3]}"
135
+ Header="7月" />
136
+ <DataGridTextColumn
137
+ Width="*"
138
+ Binding="{Binding Value[4]}"
139
+ Header="8月" />
140
+ <DataGridTextColumn
141
+ Width="*"
142
+ Binding="{Binding Value[5]}"
143
+ Header="9月" />
144
+ <DataGridTextColumn
145
+ Width="*"
146
+ Binding="{Binding Value[6]}"
147
+ Header="10月" />
148
+ <DataGridTextColumn
149
+ Width="*"
150
+ Binding="{Binding Value[7]}"
151
+ Header="11月" />
152
+ <DataGridTextColumn
153
+ Width="*"
154
+ Binding="{Binding Value[8]}"
155
+ Header="12月" />
156
+ <DataGridTextColumn
157
+ Width="*"
158
+ Binding="{Binding Value[9]}"
159
+ Header="1月" />
160
+ <DataGridTextColumn
161
+ Width="*"
162
+ Binding="{Binding Value[10]}"
163
+ Header="2月" />
164
+ <DataGridTextColumn
165
+ Width="*"
166
+ Binding="{Binding Value[11]}"
167
+ Header="3月" />
168
+ </DataGrid.Columns>
169
+ </DataGrid>
170
+ </Grid>
171
+ </Border>
172
+ </Window>
173
+ ```
174
+ 無駄にxamlのみ縛りしたのと見た目にこだわったので、少し長くなりましたがやってることは単純です。
175
+ ![アプリ画像](5efd977c949a7ce7a888a70ef1b80e66.png)
176
+
177
+ ---
178
+
179
+ しかし個人的にはこれでは使う気になれないです^^;
180
+ なんとかカラムサイズ変更だけは可能にしたいと思い、頑張っていたのですが`IMultiValueConverter`だけは書く必要がありますねぇ(上下のサイズ変更が追従する。ここまでは検証済み)
181
+
182
182
  横スクロール連動となるとビヘイビアにするよりなさそうですし、この先は未検証です。