找回密码
 立即注册

QQ登录

只需一步,快速开始

hyf3133862

最新发帖
iceman
社区贡献组   /  发表于:2011-12-6 11:22:00
11#

回复 6# hyf3133862 的帖子

1.关于为什么要使用序列化:.Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他程序或系统使用;或者在关机时下次再次启动程序使用,就需要序列化和反序列化。

2.对于序列化和反序列化,
          Spread 相关可以参考 LineBorder 类下的 Serialize 和 Deserialize 方法,Spread 的    SheetSkin、DefaultSheetSpanModel、NameStyle 都可以进行序列化,不过针对你的需求,建议使用 laonawuli 关于序列化的代码。
          还可以参考 MSDN 关于 XmlSerializer 的说明。
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-6 12:47:00
12#
原帖由 iceman 于 2011-12-6 11:05:00 发表
再次感谢 laonawuli 的大力支持:-D ~


嘿嘿 ~我还要谢谢你呢大侠~
回复 使用道具 举报
hyf3133862
初级会员   /  发表于:2011-12-6 18:31:00
13#

回复 8# laonawuli 的帖子

int rowCount = fpSpread.ActiveSheet.RowCount;

int columnCount = fpSpread.ActiveSheet.ColumnCount;
= =我在上面的代码里用了这个。 两个数字是都是500。
两个FOR循环直接就调试死机了。。。。。。。= =高手教我下
回复 使用道具 举报
hyf3133862
初级会员   /  发表于:2011-12-6 18:31:00
14#

回复 11# iceman 的帖子

int rowCount = fpSpread.ActiveSheet.RowCount;

int columnCount = fpSpread.ActiveSheet.ColumnCount;
= =我在上面的代码里用了这个。 两个数字是都是500。
两个FOR循环直接就调试死机了。。。。。。。= =高手教我下
回复 使用道具 举报
hyf3133862
初级会员   /  发表于:2011-12-6 19:38:00
15#

回复 12# laonawuli 的帖子

public class CellInfo

    {

        private int row = 0;

        private int column = 0;
这两个值我该给它赋什么?
visibleCellList我遍历了这个集合。然后给上面的赋值、
但是visibleCellList。row的值是一个字符啊?这我该怎么赋啊
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-7 09:50:00
16#

回复 14# hyf3133862 的帖子

你好,
1.不好意思,我没有重现出你的问题。为了确定问题所在,能做个 Demo 发到论坛上了吗?
2.visibleCellList 中的元素类型为 FarPoint.Win.Spread.Cell ,Cell 类下属性 Row 和 Column 均为 int 型,可以直接赋值。
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-7 17:59:00
17#
原帖由 hyf3133862 于 2011-12-6 19:38:00 发表
public class CellInfo

    {

        private int row = 0;

        private int column = 0;
这两个值我该给它赋什么?
visibleCellList我遍历了这个集合。然后给上面的赋值、
但是visibleCellList。row的值是一个字符啊?这我该怎么赋啊


哥们,我看到你说的问题了。其实我主要代码在上面写的确实很清楚了,也不知道再如何详细了。感觉没有帮上你太多忙,所以我尽量再详细阐述一下我的想法。希望你能认真看一下,如果再看不懂,我真的帮不上忙了,除非你把你的工作给我干。
你的需求是,将编辑后的Sheet样式保存下来,然后可以在别的地方使用。直接用Farpoint自带的SaveXml是不行的,因为你不需要与显示无关的数据。另外,Farpoint自带的SaveXml貌似是很费资源的,因为Sheet有太多的信息需要存储。
我不知道你想如何存储保存下来的样式,也不知道你想怎么调用这些样式。也许你想暂时存到内存里?
当你问为什么要使用Xml序列化的时候,我就很疑惑。总之,不管你想如何使用这些保存下来的样式,使用CellInfo与AllCellInfo来记录Cell信息,是必须的。Xml序列化,只是为了保存到本地来用的方法,并不是要求你必须这么做。
所以,接着说。思路是这样的:我们既然要保存样式,那么这个所谓的样式,其实是二维平面,再细说,其实是由每一个单独的Cell组成的,就像搭积木一样。而每一个Cell的RowIndex与ColumnIndex,就仿佛是X、Y坐标,RowSpan与ColumnSpan,就像是宽与高。于是,对于任意一个Cell,只要知道RowIndex与ColumnIndex与RowSpan与ColumnSpan,就能重现它所在的位置与所占用的面积了。接下来,就是需要记录每一个Cell的Border。Border有四个属性,即左、上、右、下,当为true的时候,即表示相应的位置有边。
于是,按照C#面相对象编程的思想,新建一个Border类,里面有左上右下四个属性。然后再新建一个CellInfo类,让里面有四个属性记录RowIndex、ColumnIndex、RowSpan、ColumnSpan,再有一个Border类的属性。
然后使用GetVisibleCell的方法,获得所有显示出来的Cell。之所以需要调用GetVisibleCell方法,是因为当你Span一个Cell以后,这个Cell会把其他Cell挡住,这样的话,被挡住的Cell其实对你保存下来的样式没有任何用处,将它的信息保存到CellInfo中没有意义,举一个极端的例子,例如你有一个10*10的数据,这样是100个Cell,然后你把第一个Cell的RowSpan与ColumnSpan都设置成10,那么界面上只显示了一个巨大的Cell。你会怎么保存这个样式呢?显然不需要保存100个Cell的信息,因为有99个Cell被挡住了,其实你只需要记录第一个Cell的RowIndex=0、ColumnIndex=0、RowSpan=10与ColumnSpan=10,就可以了。
visibleCellList中保存的就是所有当前可以看到的Cell。
于是:
List<CellInfo> cellInfoList=new List<CellInfo>();
foreach(Cell cell in visibleCellList)
{
    CellInfo cellInfo=new CellInfo();
    cellInfo.RowIndex=cell.Row.Index;
    cellInfo.ColumnIndex=cell.Column.Index;
    cellInfo.RowSpan=cell.RowSpan;
    cellInfo.ColumnSpan=cell.ColumnSpan;
    Border border=new Border();
    border.Left=(cell.Border as LineBorder).Left; //可能是这么写?
    border.Top=(cell.Border as LineBorder).Top;
    border.Right=(cell.Border as LineBorder).Right;
    border.Bottom==(cell.Border as LineBorder).Bottom;
    cellInfo.Border=border;

    cellInfoList.Add(cellInfo);
}

现在cellInfoList就保存了所有显示出来的Cell的信息。
好了。现在要讲如何复用。
例如你新建了一个Sheet。
foreach(CellInfo cellInfo in cellInfoList)
{
    Cell cell= Sheet.Cells[cellInfo.RowIndex,CellInfo.ColumnIndex];
    cell.RowSpan=cellInfo.RowSpan;
    cell.ColumnSpan=cellInfo.ColumnSpan;
    Border border= cellInfo.Border;
    LineBorder lineBorder=new LineBorder(Color.Black,1,border.Left,border.Top,border.Right,border.Bottom);
    cell.Border=lineBorder;
}

这就是样式的存储与复用。
如果里面还涉及到颜色等东西,你就需要修改Border类,在Border类中添加记录颜色与字体的属性。

最后要说,如果你想将样式保存成为一个文件或者什么,就可以用XML序列化了。
另外需要告诉你,Font属性与Color属性是无法被XML序列化的,推荐你用string 形式存储Font与Color,然后再在程序里将string 转化为Font或者颜色。
如何转换,可以谷歌一下。

哥们,我花了半小时给你写这东西,就是希望你能学到这些,说实话,我是菜鸟,看到你的问题,我觉得你还应该努力。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-13 17:09:00
18#

回复 1# hyf3133862 的帖子

请问,楼主的问题解决了吗?:-D
回复 使用道具 举报
jplzj
论坛元老   /  发表于:2011-12-30 12:53:00
19#
能否给出完整代码
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-30 13:56:00
20#

回复 19# jplzj 的帖子

jplzj  你好,可以结合 3# 和 10# 的代码进行编辑,即为完整代码~
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部