好吧,我已经搜索了很长时间来解决这个问题。我正在为 WPF DataGrid 开发简单的打印系统,并设法使用 DataTable 打印具有统一单元格放置的表格,并将其设置为 DataGrid 的 ItemSource。
然而,我需要some行至仅包含一个单元格(您可以将其视为表内的“行组标题”)。
因此,由于我还没有找到任何关于 DataTable 跨越多列的单元格的信息(如果可以做到这一点,那么知道如何操作将是一件很棒的事情),我想我必须手动向 DataGrid 添加行,并解决类似的问题这:
- 使用所需的列创建新的 DataGrid
- 一行一行添加,设置跨越或不跨越行的DataGridCellPanel
第二点是我遇到问题的地方(如果是对的,那就是)。我需要add row到使用的 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>
注意: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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)