c1datagrid WPF 中列表列头合并问题
<c1:DataGridRowHeaderColumn Header="" Binding="{Binding Continent}" />
<c1:DataGridRowHeaderColumn Header="" Binding="{Binding Country}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Fourth}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Fourth}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Fourth}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Fourth}" />
<c1:DataGridTextColumn Header="" Binding="{Binding First}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Second}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Third}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Fourth}" />
<c1:DataGridTextColumn Header="" Binding="{Binding Fourth}" />
之前 http://gcdn.gcpowertools.com.cn/showtopic-16377.html 中有demo样例,但是我把绑定的列更改成上面的代码后。发现在原始列前加的列可以自动合并,后面的就无法自动合并了,这个是什么问题呢? 运行结果如下:
回复 1楼zxc9089的帖子
谢谢您的反馈。
您的意思是图上的最后一列未进行自动合并?
根据您链接中的示例所示,在MainWinDow.xaml.cs文件中,初始化的时候会获取需要合并的行列的信息,合并的区域是从这里读取并merge的。
请问您有没有将您新添加的需要合并的列的信息添加到需要合并的range里?如果没有,根据逻辑代码,是不会合并的。
初始化保存合并信息的代码:
// save headers rows and columns for later
_headerRowColumns = grid.Columns.Take(3).ToArray();
_headerColumnRows = grid.TopRows.Take(3).ToArray();[/
合并时候获取信息的代码:
var nonHeadersViewportCols = grid.Viewport.Columns.Where(c => !_headerRowColumns.Contains(c)).ToArray();
var nonHeadersViewportRows = grid.Viewport.Rows.Where(r => !_headerColumnRows.Contains(r)).ToArray();
请根据您的项目实际情况修改这些代码,谢谢。 回复 2楼Alice的帖子
//获取grid中为行头的列
_headerRowColumns = grid.Columns.Take(2).ToArray();
//获取grid中为列头的Toprow
_headerColumnRows = grid.TopRows.Take(2).ToArray();
//获取grid中出去列头行头的实际数据行列范围
var nonHeadersViewportCols = grid.Viewport.Columns.Where(c => !_headerRowColumns.Contains(c)).ToArray();
var nonHeadersViewportRows = grid.Viewport.Rows.Where(r => !_headerColumnRows.Contains(r)).ToArray();
不知道针对于上面的个人理解注释是否正确?
那么:
//合并前两行和从第三列开始以后的列的范围内单元格,如果出现相同的文本就合并
foreach (var range in MergingHelper.Merge(System.Windows.Controls.Orientation.Vertical, _headerColumnRows, nonHeadersViewportCols, true))
{
e.Merge(range);
}
//合并前两列和从第三行开始以后的行的范围内单元格,如果出现相同的文本就合并
foreach (var range in MergingHelper.Merge(System.Windows.Controls.Orientation.Horizontal, nonHeadersViewportRows, _headerRowColumns, true))
{
e.Merge(range);
}
这两段代码是不是就代表了合并以下红线标出区域的单元格?
那么里应当最后一列asd应该是在合并范围内的呀。 回复 3楼zxc9089的帖子
是的,您的理解是对的。
合并的基本方法就是在MergingCells事件里调用e.Merge方法,传入你需要合并的区域合并。
比如合并第五列的第一行和第二行,代码参考:
DataGridCell cell0 = grid;
DataGridCell cell1 = grid;
e.Merge(new DataGridCellsRange(cell0, cell1));
您如果使用MergingHelper来完成合并,这个接口是根据之前给您的示例设计逻辑代码的,如果您修改了,也必须去修改MergingHelper类。请查看MergingHelper.cs文件的Merge的逻辑代码,它有去判断方向等各个因素在里面。
因此针对这个问题,您可以使用我提供给您的e.Merge方法去合并您所期望的行列。或者您去修改MergingHelper.cs文件的代码逻辑满足您的业务需求。 问题已解决,详细阅读了下MergingHelper的代码逻辑,修改了合并方向,问题解决了。 谢谢了
:i0tw: 回复 5楼zxc9089的帖子
:jy74a:解决的很快速。
非常感谢您的反馈。
页:
[1]