DevExpress XtraTreeList打印预览时列颜色格式未生效求助
DevExpress XtraTreeList打印预览时自定义单元格颜色不生效的解决办法
我刚好碰到过类似的问题,原因很简单:TreeList的NodeCellStyle事件只作用于界面显示,打印预览的绘制逻辑是独立的,不会自动复用这个事件里的样式设置。下面给你两种可行的解决方式:
方法一:使用TreeList专属打印链接并订阅自定义绘制事件
把通用的PrintableComponentLink换成TreeListPrintableComponentLink(这是DevExpress专门为TreeList打印设计的类),然后在它的CustomDrawNodeCell事件里重新应用你的颜色规则:
void PreviewPrintableComponent(IPrintable component, UserLookAndFeel lookAndFeel) { // 替换为TreeList专用的打印链接 TreeListPrintableComponentLink link = new TreeListPrintableComponentLink(new PrintingSystemBase()) { TreeList = component as TreeList, Landscape = true, PaperKind = PaperKind.A5, Margins = new Margins(20, 20, 20, 20) }; // 订阅打印时的单元格绘制事件 link.CustomDrawNodeCell += Link_CustomDrawNodeCell; link.CreateDocument(); link.ShowRibbonPreview(lookAndFeel); } // 打印时的单元格样式设置,复用你原来的逻辑 private void Link_CustomDrawNodeCell(object sender, CustomDrawNodeCellEventArgs e) { if (e.Column.FieldName == "Number") { if (Convert.ToInt32(e.Node.GetValue(e.Column.AbsoluteIndex)) < 0) { e.Appearance.ForeColor = Color.Red; // 告诉打印系统我们已经自定义了样式,不要用默认的 e.Handled = true; } } }
方法二:提取公共样式逻辑(推荐,避免代码重复)
如果你的样式规则比较复杂,把样式逻辑抽成公共方法,让界面显示和打印预览都调用它,这样后续修改样式只需要改一处:
// 公共方法:统一处理单元格颜色样式 private void SetCellColorStyle(GetCustomNodeCellStyleEventArgs styleArgs) { if (styleArgs.Column.FieldName == "Number") { if (Convert.ToInt32(styleArgs.Node.GetValue(styleArgs.Column.AbsoluteIndex)) < 0) { styleArgs.Appearance.ForeColor = Color.Red; } } } // 界面显示时的样式事件 private void TreeList_NodeCellStyle(object sender, GetCustomNodeCellStyleEventArgs e) { SetCellColorStyle(e); } // 打印时的样式事件 private void Link_CustomDrawNodeCell(object sender, CustomDrawNodeCellEventArgs e) { // 把打印事件的参数转换成界面事件的参数类型,调用公共方法 var args = new GetCustomNodeCellStyleEventArgs(e.Node, e.Column, e.Appearance); SetCellColorStyle(args); e.Handled = true; }
这样修改后,打印预览里的Number列负值就会显示红色了,和界面保持一致。
内容的提问来源于stack exchange,提问作者Wackie
相关产品推荐
相关产品推荐

