Silverlight DataGrid,在标题中有动态的多行多列






3.86/5 (6投票s)
为带有多个行/列的 Silverlight DataGrid 创建动态标题。
引言
我在 2006 年开发一个产品,其中一项要求是在标题中创建一个具有多个列和行的 DataGrid
。在我之前的文章 动态多行/列网格标题 中,我介绍了我使用的想法。最近几个月,我一直在探索 Silverlight,我想知道如何使用 Silverlight DataGrid
实现相同的功能。我在互联网上搜索解决方案,但找不到任何解决方案。所以我提出了一种非常粗略的方法来做到这一点。我正在寻找更好的解决方案。此外,我想要的另一个功能是以 Excel 格式导出相同的内容。目前,我不知道该怎么做。
背景
因此,此实验的目标是使用 Silverlight DataGrid
实现以下输出
我使用了与我之前的文章中描述的类似技术来计算标题的行和列跨度。我在这里跳过逻辑。这次,我还需要一个页脚。因此,我采取的方法是动态创建一个 MxN 大小的网格。M 将是标题行数加上 1 个用于 DataGrid
,加上 1 个用于页脚。即,M = 标题行数 + 2。N 将等于 DataGrid
列数。我会将页脚详细信息放在网格的最后一行,将 DataGrid
放在网格的倒数第二行,并将所有标题项目放在其余行中,并带有适当的行和列跨度。
使用代码
我使用了相同的三个类(在前一篇文章中描述)来解析标题字符串并创建要呈现的集合。
DynamicHeaderCell
DynamicHeader
DynamicHeaders
我添加了另一个类 RowHeader
,而不是使用 ArrayList
,我使用了 RowHeader
的列表来获取解析后的标题单元格集合。我添加了另一个类 SalseData
来获取必要的数据。此类有四个静态方法
GetSalseData
- 要在DataGrid
中显示的数据GetSalseDataHeader
- 标题字符串GetSalseDataColumnHeader
- 用于创建DataGrid
列GetSalseDataFooter
- 要在页脚中显示的数据
在上述函数中使用了硬编码字符串。在实际应用程序中,这些方法可以从数据库或任何其他来源获取数据。
XAML 代码很简单,由 Visual Studio 生成。所有工作都在代码隐藏中动态完成。
以下成员变量在代码隐藏中定义
DataGrid grdData = new DataGrid() { AutoGenerateColumns = false };
bool bGridInitialized = false;
List<RowHeader> Headers = null;
在代码隐藏中定义了三种方法
InitUI
grdData_LayoutUpdated
AddHeaderTextBlock
在方法 InitUI()
中
- 标题被解析并存储在
Headers
集合中 - 创建
DataGrid
列并添加数据源 - 创建网格行。
String[] ColHeaders = SalseData.GetSalseDataColumnHeader().Split(',');
Headers = dynHead.ParseHeader();
foreach (String col in ColHeaders)
{
String[] colHeader = col.Split('|');
grdData.Columns.Add(new DataGridTextColumn { Header = colHeader[0],
Binding = new System.Windows.Data.Binding(colHeader[1]),
IsReadOnly = true });
}
grdData.ItemsSource = SalseData.GetSalseData();
在方法 grdData_LayoutUpdated()
中
- 创建网格列
- 调用
AddHeaderTextBlock
方法来添加标题和页脚文本。 - 定位
DataGrid
。
for (int i = 0; i < grdData.Columns.Count; i++)
{
DataGridColumn dgc = grdData.Columns[i];
LayoutRoot.ColumnDefinitions.Add(...);
}
在方法 AddHeaderTextBlock()
中
- 将具有适当边框粗细的边框和带有标题文本的文本块添加到网格的相应单元格。
历史
- 初始版本。