6

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

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

因此,由于我还没有发现任何关于 DataTable 跨越多列的单元格的信息(如果可以做到这一点,那么知道如何制作将是一件很棒的事情),我想我必须手动将行添加到 DataGrid,并解决类似的问题这个:

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

第二点是我有问题的地方(如果它是对的,那就是)。我需要向使用简单字符串数组作为单元格数据的 DataGrid添加行(数组中的索引应该与单元格索引匹配)。有没有简单的方法来做这样的事情?

4

1 回答 1

4

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

最好和最简单的做法是在加载 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>

注意: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。

于 2013-05-10T09:56:45.570 回答