C# 使一些DataGrid单元格跨越多列

C# 使一些DataGrid单元格跨越多列,c#,wpf,C#,Wpf,好的,我已经寻找了相当长的时间来解决这个问题。我正在为WPF DataGrids开发一个简单的打印系统,并且已经使用DataTable并将其设置为DataGrid的ItemSource来打印具有统一单元格位置的表 但是,我需要一些行只包含一个单元格(您可以将其视为表中的“行组标题”) 因此,由于我还没有发现关于DataTable跨多列单元格的任何信息(如果可以做到这一点,了解如何做到这一点将是一件非常棒的事情),我想我必须手动将行添加到DataGrid,并像这样解决它: 使用所需列创建新的Da

好的,我已经寻找了相当长的时间来解决这个问题。我正在为WPF DataGrids开发一个简单的打印系统,并且已经使用DataTable并将其设置为DataGrid的ItemSource来打印具有统一单元格位置的表

但是,我需要一些只包含一个单元格(您可以将其视为表中的“行组标题”)

因此,由于我还没有发现关于DataTable跨多列单元格的任何信息(如果可以做到这一点,了解如何做到这一点将是一件非常棒的事情),我想我必须手动将行添加到DataGrid,并像这样解决它:

  • 使用所需列创建新的DataGrid
  • 逐个添加行,设置跨行或不跨行的DataGridCellPanel

第二点是我的问题所在(如果它是对的,那就是)。我需要将行添加到使用简单字符串数组作为单元格数据的DataGrid中(数组中的索引应该是单元格索引)。有没有一种简单的方法可以做到这一点?

因此,在对所有这些进行了更多的处理之后,我找到了一个非常好的解决方案

最好且最简单的方法是在加载DataGrid后将数据模板应用于特定行。因此,我坚持使用DataTables的最初想法,并记住了需要更改模板的索引。我只是从这些索引中获取了DataGridRows,并应用了一个模板,该模板具有跨多个列的定制ItemsPanelTemplate

编辑:应丹尼尔的要求,我加入了一些代码

我们需要的第一件事是生成行的模板:

<ControlTemplate TargetType='{x:Type DataGridRow}'
                 xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
                 xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
    <Border>
        <DataGridCellsPresenter Foreground='Black'>
            <DataGridCellsPresenter.ItemsPanel>
                <ItemsPanelTemplate>
                    <local:DataGridSpannedCellPanel />
                </ItemsPanelTemplate>
            </DataGridCellsPresenter.ItemsPanel>
        </DataGridCellsPresenter>
    </Border>
</ControlTemplate>
另外请注意,表中的行需要按如下方式生成:

if (bindableQuote.IsGroup())
{
    table.Rows.Add("Header");
}
else
{
    table.Rows.Add(rowData.ToArray());
}

就这样,剩下的唯一一件事就是弄清楚如何实现DataGridSpandCellPanel。

你能提供一个简单的例子吗?请参阅编辑后的回复。我很乐意回答您可能提出的任何问题。@DejanMaksimovic:您知道如何实现DataGridSpandCellPanel了吗?如果是,您可以发布代码或重要部分吗?谢谢。@RobotMess:我认为发布额外的代码确实超出了问题的范围,但您应该扩展DataGridCellsPanel并覆盖ArrangeOverride(Size availableSize)方法。然后使用availableSize对Children集合中的第一个子项调用Arrange(rect)。用零矩形排列其余的孩子。@DejanMaksimovic:谢谢,我确实在一段时间后找到了答案。我只需要为跨越的单元格调用child.Arrange(rectthatchincludespanwidth),为隐藏的单元格调用child.Arrange(new Rect(0,0,0,0))。以下是我在XAML中完全实现的方法:
if (bindableQuote.IsGroup())
{
    table.Rows.Add("Header");
}
else
{
    table.Rows.Add(rowData.ToArray());
}