使一些DataGrid单元格跨越多个列

本文关键字:跨越 单元格 DataGrid | 更新日期: 2023-09-27 18:13:00

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

然而,我需要一些只包含一个单元格(你可以把它想象成表中的"行组头")。

所以,因为我没有发现任何关于DataTable的单元格跨越多列(如果这可以做到,这将是一个伟大的事情知道如何),我想我将不得不手动添加行到DataGrid,并解决它像这样:

    创建新的数据网格
  • 逐个添加行,设置DataGridCellPanel跨或不跨行

第二点是我有问题的地方(如果它是正确的,那就是)。我需要将行添加到使用简单字符串数组作为单元格数据的DataGrid(数组中的索引应该是单元格索引)。有什么简单的方法可以做到吗?

使一些DataGrid单元格跨越多个列

因此,在对所有这些进行了更多的摆弄之后,我已经得到了一个非常好的解决方案。

最好和最简单的方法是在加载DataGrid后将数据模板应用于特定的行。所以,我坚持最初的想法与数据表,并记住索引需要改变他们的模板。我只是从这些索引中获取了DataGridRows,并应用了自定义的ItemsPanelTemplate模板,该模板跨越了多个列。

在Daniel的要求下,我加入了一些代码。

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

<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>

注意:local:DataGridSpannedCellPanel是一个自定义的DataGridCellsPanel与重写的ArrangeOverride方法,使第一个单元格跨度整个大小。

例如,您可以在代码隐藏中创建字符串并从中加载模板。下一件事是创建网格,并使用这个新模板初始化一些行:
var newGrid = MakeNewDataGrid();
newGrid.ItemsSource = myTable.AsDataView();
var template = XamlReader.Parse(HeaderRowTemplate) as ControlTemplate;
foreach (int index in myHeaderIndices)
{
    var container = newGrid.ItemContainerGenerator.ContainerFromIndex(index);
    var row = container as DataGridRow;
    if (row != null)
    {
        row.Template = template;
    }
}

还需要注意的是,表中的行需要按如下方式创建:

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

这就是它,剩下的唯一的事情是弄清楚如何实现DataGridSpannedCellPanel