zxc9089 发表于 2015-11-10 10:30:00

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样例,但是我把绑定的列更改成上面的代码后。发现在原始列前加的列可以自动合并,后面的就无法自动合并了,这个是什么问题呢? 运行结果如下:

Alice 发表于 2015-11-10 11:24:00

回复 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 =&gt; !_headerRowColumns.Contains(c)).ToArray();
            var nonHeadersViewportRows = grid.Viewport.Rows.Where(r =&gt; !_headerColumnRows.Contains(r)).ToArray();
请根据您的项目实际情况修改这些代码,谢谢。

zxc9089 发表于 2015-11-10 14:03:00

回复 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 =&gt; !_headerRowColumns.Contains(c)).ToArray();
var nonHeadersViewportRows = grid.Viewport.Rows.Where(r =&gt; !_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应该是在合并范围内的呀。

Alice 发表于 2015-11-10 15:20:00

回复 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文件的代码逻辑满足您的业务需求。

zxc9089 发表于 2015-11-10 17:01:00

问题已解决,详细阅读了下MergingHelper的代码逻辑,修改了合并方向,问题解决了。 谢谢了
:i0tw:

Alice 发表于 2015-11-10 17:11:00

回复 5楼zxc9089的帖子

:jy74a:解决的很快速。

非常感谢您的反馈。
页: [1]
查看完整版本: c1datagrid WPF 中列表列头合并问题