我们有一个Web服务,它从服务器获取报告并将其返回到Silverlight GUI。在GUI中,我们有一个调用以下函数的事件处理程序:
private void PopulateDataGrids()
{
try
{
reportTitle = reportDataUtil.ReportHeader.Rows.First(r => r.Items[ReportTools.FIELDNAME_STRING].ToString() == ReportTools.FIELDVALUE_TITLE).Items[ReportTools.FIELDVALUE_STRING].ToString();
dg_Report_Header.DataSource = reportDataUtil.ReportHeader;
dg_Report_Header.CanUserSortColumns = false;
dg_Report_Header.CanUserReorderColumns = false;
dg_Report_Header.CanUserResizeColumns = true;
dg_Report_Header.DataBind();
dg_Report_Header.UpdateLayout();
dg_Report_Detail.DataSource = reportDataUtil.ReportDetails;
dg_Report_Detail.CanUserSortColumns = true;
dg_Report_Detail.CanUserReorderColumns = true;
dg_Report_Detail.CanUserResizeColumns = true;
dg_Report_Detail.DataBind();
dg_Report_Detail.UpdateLayout();
//Hide the ElementID colmun
if (dg_Report_Detail.Columns.Count > 0)
{
var col = dg_Report_Detail.Columns.FirstOrDefault(dc => dc.Header.ToString() == NetVisSolution.Reports.ReportTools.COLUMNNAME_ELEMENTID);
if (col != null)
{
col.Visibility = System.Windows.Visibility.Collapsed;
}
}
}
catch (Exception)
{
ClearResources();
closeReportDataViewer();
ErrorWindow.CreateNew("Unable to open selected report data, the file maybe corrupted or not \nin the server specified location.");
//throw new Exception(ex.Message, ex.InnerException);
}
}
麻烦的是,详细信息表可以是14000行,占用超过一兆字节。加载此类报告时,dg_Report_Detail.DataBind();呼叫需要几分钟并锁定GUI。
是否有一种简单的方法可以异步或以应用程序保持响应的方式执行此操作?
提前致谢,
--- Alistair。
答案 0 :(得分:0)
虽然DataGrid实现了行虚拟化,但它仍然可以花费大量时间分别计算每行的高度。分配RowHeight将跳过所有这些计算。
<sdk:DataGrid AutoGenerateColumns="False" RowHeight="20">
</sdk:DataGrid>