使一些DataGrid单元格跨越多列

时间:2013-05-09 20:48:49

标签: c# wpf

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

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

所以,因为我还没有找到任何关于跨越多列的DataTable单元格(如果可以这样做,知道如何这是一件好事),我想我必须手动向DataGrid添加行,并解决它是这样的:

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

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

1 个答案:

答案 0 :(得分:4)

所以在经过一番调整之后,我已经找到了一个非常好的解决方案。

最好和最简单的方法是在加载DataGrid后将数据模板应用于特定的行。因此,我坚持使用DataTables的原创想法,并记住需要更改模板的索引。我刚刚从这些索引中获取了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。