几经考虑,终于从诚意比较足的
http://www.commuch.com 上购买了FASTREPORT.NET的源码,有了源码,自己想怎么改就怎么改。
FP没有竖排,毕竟是老毛子的东西。实现竖排有两种方式 :在每个字符后强制回车(这意味着,要么动态检测每个需要竖排的单元格内容,然后为了显示而修改其实际内容,最终会影响导出结果与原数据不一致。当时我想竖排的一般是标头,所以增中了一个属性叫READONLY,用于在自动绑定数据时跳过这些标头)。另一种方法就是在单元格里套一个LABEL,让LABEL变的只有一个字宽,这样渲染里就会自动换行了。但这种方法带来的工作量是很大的。我本来就是在写自动转换工具,没必要这样搞,于是买来源码。渲染的事情让渲染去做,增加了一个竖排属性,然后修改DRAWTEXT方法,很快就处理好了。
if (TextOrientation) {
//竖排时强制宽度
float fontWidth = e.Graphics.MeasureString("我", font).Width;
textRect = new RectangleF(
(AbsLeft + Padding.Left) * e.ScaleX + ((Width - Padding.Horizontal) * e.ScaleX - fontWidth) / 2,
(AbsTop + Padding.Top) * e.ScaleY,
(fontWidth - 3),//* e.ScaleX, //-3,令中文前遇空格自动换行
(Height - Padding.Vertical) * e.ScaleY);
}
设计界面看起来很好,但在预览与打印的时候还是没有实现 竖排,于是悲剧来了,因为不 明白设计思路,只能从预览开始一路追查,发现在预览时,后面追加的属性竟然丢失了,于是怀疑是在反射时丢失的,进而怀疑是在序列化与反序列化出问题了,追了一上午,证明不是这里的问题,也不是类型转换时丢失了。
又反复追,观察一切可能的问题,又追了一下午,终于发现了一个不起眼的代码,预览的组件不是原报表的组件,而是复制了一份,问题就出现这个克隆上,克隆时没有使用反射去复制原对象的一切属性,而是另外写了个方法来复制属性。在其中追加我要属性。预览正常。
public override void Assign(Base source)
{
base.Assign(source);
TextObject src = source as TextObject;
AutoWidth = src.AutoWidth;
HorzAlign = src.HorzAlign;
VertAlign = src.VertAlign;
Angle = src.Angle;
RightToLeft = src.RightToLeft;
WordWrap = src.WordWrap;
Underlines = src.Underlines;
Font = src.Font;
TextFill = src.TextFill.Clone();
Trimming = src.Trimming;
FontWidthRatio = src.FontWidthRatio;
FirstTabOffset = src.FirstTabOffset;
TabWidth = src.TabWidth;
Clip = src.Clip;
Highlight.Assign(src.Highlight);
Wysiwyg = src.Wysiwyg;
LineHeight = src.LineHeight;
HtmlTags = src.HtmlTags;
AutoShrink = src.AutoShrink;
AutoShrinkMinSize = src.AutoShrinkMinSize;
ParagraphOffset = src.ParagraphOffset;
ReadOnly = src.ReadOnly;
TextOrientation = src.TextOrientation;
}
打印不正常,修改缩放比例,完成。