找回密码
 立即注册

QQ登录

只需一步,快速开始

hyf3133862

初级会员

1

主题

7

帖子

369

积分

初级会员

积分
369

活字格认证

最新发帖
hyf3133862
初级会员   /  发表于:2011-12-4 13:59  /   查看:10588  /  回复:19
我在控件里做了一个右键菜单。然后功能是把所选中的区域里的单元格的框的线都赋予颜色。但是有的线会重复在一起。变得比外边框的线粗。如何解决?还有我做了一个合并单元格的功能。但是我想再这些完成了以后。保存这些我边框的变色,还有单元格合并的格式。以方便下次调用。我知道是用SAVE方法保存为XML文件。但是这样保存的话。就会连读取的数据库的数据一起也保存进去了。如何只保存格式呢。以上边框重复问题和保存问题。请斑竹。指教下。最好能给我代码研究下。千万感谢。

19 个回复

正序浏览
iceman
社区贡献组   /  发表于:2011-12-30 13:56:00
20#

回复 19# jplzj 的帖子

jplzj  你好,可以结合 3# 和 10# 的代码进行编辑,即为完整代码~
回复 使用道具 举报
jplzj
论坛元老   /  发表于:2011-12-30 12:53:00
19#
能否给出完整代码
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-13 17:09:00
18#

回复 1# hyf3133862 的帖子

请问,楼主的问题解决了吗?:-D
回复 使用道具 举报
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-7 09:50:00
16#

回复 14# hyf3133862 的帖子

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

回复 12# laonawuli 的帖子

public class CellInfo

    {

        private int row = 0;

        private int column = 0;
这两个值我该给它赋什么?
visibleCellList我遍历了这个集合。然后给上面的赋值、
但是visibleCellList。row的值是一个字符啊?这我该怎么赋啊
回复 使用道具 举报
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 18:31:00
13#

回复 8# laonawuli 的帖子

int rowCount = fpSpread.ActiveSheet.RowCount;

int columnCount = fpSpread.ActiveSheet.ColumnCount;
= =我在上面的代码里用了这个。 两个数字是都是500。
两个FOR循环直接就调试死机了。。。。。。。= =高手教我下
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-6 12:47:00
12#
原帖由 iceman 于 2011-12-6 11:05:00 发表
再次感谢 laonawuli 的大力支持:-D ~


嘿嘿 ~我还要谢谢你呢大侠~
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部