找回密码
 立即注册

QQ登录

只需一步,快速开始

hyf3133862

初级会员

1

主题

7

帖子

369

积分

初级会员

积分
369

活字格认证

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

19 个回复

倒序浏览
hyf3133862
初级会员   /  发表于:2011-12-4 14:15:00
沙发
:~斑竹大大。你在哪里啊。帮我解决下吧。我明天上班要交差啊。
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-5 09:42:00
板凳
原帖由 hyf3133862 于 2011-12-4 13:59:00 发表
我在控件里做了一个右键菜单。然后功能是把所选中的区域里的单元格的框的线都赋予颜色。但是有的线会重复在一起。变得比外边框的线粗。如何解决?还有我做了一个合并单元格的功能。但是我想再这些完成了以后。保存这些我边框的变色,还有单元格合并的格式。以方便下次调用。我知道是用SAVE方法保存为XML文件。但是这样保存的话。就会连读取的数据库的数据一起也保存进去了。如何只保存格式呢。以上边框重复问题和保存问题。


iceman大大还没上班呢,我这个网友尝试帮你解决一下哈

第一个问题,我猜你是使用LineBorder,然后让每个被选中的Cell的left、top、right、bottom都为true了吧?
你可以这样做:
比如你选中的区域是10*10
那么,先用循环让每一个Cell的Border为 left=false , top=true, right=true, bottom=false
然后再循环第一列的Cell,让它们的Border 在原来的基础上把left变为true。
然后再循环最后一行的Cell,让它们的Border在原来的基础上把bottom变为true。
做完这些后,中间的Cell就不会有粗线了。

第二个问题,你可以自定义一个类,里面记录所有显示出来的Cell的数据,例如:
  1.     /// <summary>
  2.     /// Cell信息。
  3.     /// </summary>
  4.     public class CellInfo
  5.     {
  6.         private int row = 0;
  7.         private int column = 0;
  8.         private int rowSpan = 1;
  9.         private int columnSpan = 1;
  10.         private CellBorder cellBorder=new CellBorder();

  11.         /// <summary>
  12.         /// 行序号。
  13.         /// </summary>
  14.         public int Row
  15.         {
  16.             get
  17.             {
  18.                 return row;
  19.             }
  20.             set
  21.             {
  22.                 row = value;
  23.             }
  24.         }

  25.         /// <summary>
  26.         /// 列序号。
  27.         /// </summary>
  28.         public int Column
  29.         {
  30.             get
  31.             {
  32.                 return column;
  33.             }
  34.             set
  35.             {
  36.                 column = value;
  37.             }
  38.         }

  39.         /// <summary>
  40.         /// 行合并数。
  41.         /// </summary>
  42.         public int RowSpan
  43.         {
  44.             get
  45.             {
  46.                 return rowSpan;
  47.             }
  48.             set
  49.             {
  50.                 rowSpan = value;
  51.             }
  52.         }

  53.         /// <summary>
  54.         /// 列合并数。
  55.         /// </summary>
  56.         public int ColumnSpan
  57.         {
  58.             get
  59.             {
  60.                 return columnSpan;
  61.             }
  62.             set
  63.             {
  64.                 columnSpan = value;
  65.             }
  66.         }

  67.        public CellBorder CellBorder
  68.       {
  69.            get
  70.             {
  71.                 return cellBorder;
  72.             }
  73.             set
  74.             {
  75.                 cellBorder= value;
  76.             }
  77.       }
  78.     }

  79.     /// <summary>
  80.     /// Cell的边框。
  81.     /// </summary>
  82.     public class CellBorder
  83.     {
  84.         private bool left = false;
  85.         private bool top = false;
  86.         private bool right = false;
  87.         private bool bottom = false;

  88.         /// <summary>
  89.         /// 左边框。
  90.         /// </summary>
  91.         public bool Left
  92.         {
  93.             get
  94.             {
  95.                 return left;
  96.             }
  97.             set
  98.             {
  99.                 left = value;
  100.             }
  101.         }

  102.         /// <summary>
  103.         /// 上边框。
  104.         /// </summary>
  105.         public bool Top
  106.         {
  107.             get
  108.             {
  109.                 return top;
  110.             }
  111.             set
  112.             {
  113.                 top = value;
  114.             }
  115.         }

  116.         /// <summary>
  117.         /// 右边框。
  118.         /// </summary>
  119.         public bool Right
  120.         {
  121.             get
  122.             {
  123.                 return right;
  124.             }
  125.             set
  126.             {
  127.                 right = value;
  128.             }
  129.         }

  130.         /// <summary>
  131.         /// 下边框。
  132.         /// </summary>
  133.         public bool Bottom
  134.         {
  135.             get
  136.             {
  137.                 return bottom;
  138.             }
  139.             set
  140.             {
  141.                 bottom = value;
  142.             }
  143.         }
  144.     }
复制代码
然后:通过这个算法来取界面上显示出来的Cell(过滤掉那些被其他Span挡着的Cell),如果你希望保留所有Cell的信息,那就不用这个算法了。不管怎样,先给你:
  1.         /// <summary>
  2.         /// 获得当前显示出来的Cell。被其他SpanCell挡住的Cell不被获得。
  3.         /// </summary>
  4.         private void GetVisibleCell()
  5.         {
  6.             //所有当前显示出来的Cell。
  7.             List<Cell> visibleCellList=new List<Cell>();

  8.             //经典的循环。
  9.             int rowCount = fpSpread1_Sheet1.RowCount;
  10.             int columnCount = fpSpread1_Sheet1.ColumnCount;
  11.             for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
  12.             {
  13.                 for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
  14.                 {
  15.                     Cell cell = fpSpread1_Sheet1.Cells[rowIndex, columnIndex];
  16.                     FilterCell(visibleCellList, cell);
  17.                 }
  18.             }

  19.             MessageBox.Show(visibleCellList.Count.ToString());
  20.         }

  21.         /// <summary>
  22.         /// 过滤Cell。如果cell没有被visibleCellList中的任何一个Cell挡住,则将cell添加进visibleCellList。
  23.         /// </summary>
  24.         /// <param name="visibleCellList">当前显示出来的Cell。</param>
  25.         /// <param name="cell">被过滤的Cell。</param>
  26.         private void FilterCell(List<Cell> visibleCellList, Cell cell)
  27.         {
  28.             //将Cell的位置转化为Point。
  29.             Point p = new Point(cell.Column.Index, cell.Row.Index);
  30.             foreach (Cell c in visibleCellList)
  31.             {
  32.                 //将目前已经显示出来的Cell的位置与所占用的面积转化为Rectangle。
  33.                 Rectangle r = new Rectangle(c.Column.Index, c.Row.Index, c.ColumnSpan, c.RowSpan);
  34.                 //如果Rectangle包含Point,则说明cell已经被挡住了,则return。
  35.                 if (r.Contains(p))
  36.                 {
  37.                     return;
  38.                 }
  39.             }
  40.             //如果走到这一步了,说明cell没有被visibleCellList中的任何一个Cell挡住,则将cell添加进visibleCellList。
  41.             visibleCellList.Add(cell);
  42.         }
复制代码
通过算法得到界面上所有显示出来的Cell之后,你把这些Cell的Border、颜色等信息保存到上面说的CellInfo类中。
然后使用Xml序列化,将Cell的信息保存。
你需要新建一个类,例如叫做AllCellInfo,然后里面有个属性是List<CellInfo>  CellInfoList,然后用这个CellInfoList保存你每一个CellInfo,然后用XML序列化,将AllCellInfo序列化成XML。
序列化方式:
  1.         /// <summary>
  2.         /// 将AllCellInfo序列化为Xml字符串。
  3.         /// </summary>
  4.         /// <param name="allCellInfo">AllCellInfo实体。</param>
  5.         /// <returns>Xml字符串。</returns>
  6.         public static string Serialize(AllCellInfo allCellInfo)
  7.         {
  8.             XmlSerializer xmlSerializer = new XmlSerializer(typeof(AllCellInfo));
  9.             using (StringWriter sw = new StringWriter())
  10.             {
  11.                 xmlSerializer.Serialize(sw, allCellInfo);
  12.                 return sw.ToString();
  13.             }
  14.         }
复制代码
反序列化:
  1.    /// <summary>
  2.         /// 将Xml字符串反序列化为AllCellInfo实体。
  3.         /// </summary>
  4.         /// <param name="xml">Xml字符串。</param>
  5.         /// <returns>AllCellInfo实体。</returns>
  6.         public static AllCellInfo Deserialize(string xml)
  7.         {
  8.              XmlSerializer xmlSerializer = new XmlSerializer(typeof(AllCellInfo));
  9.             using (StringReader sr = new StringReader(xml))
  10.             {
  11.                 AllCellInfo allCellInfo= xmlSerializer.Deserialize(sr) as AllCellInfo;
  12.                 return allCellInfo;
  13.             }
  14.         }
复制代码
OK~我能说的都在上面了~
为了对版主iceman连日来对我的帮助表示感谢,所以帮他回答了这个问题~
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-5 10:11:00
地板

回复 2# hyf3133862 的帖子

呵呵,hyf3133862 你好,不好意思这么久才回复,楼上的方法是正确的,顶楼上~
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-5 10:12:00
5#

回复 3# laonawuli 的帖子

laonawuli ,真的很感谢你,眼泪哗哗的~
回复 使用道具 举报
hyf3133862
初级会员   /  发表于:2011-12-5 19:39:00
6#

回复 3# laonawuli 的帖子

你好。解决单元格框重复的问题可以发个代码我看下吗?还有是否可以再加个功能就是判断选中的区域是不是已经加过颜色的。如果有加过颜色的线就不加了。
保存的问题1.通过算法得到界面上所有显示出来的Cell之后,如何把Cell的Border、颜色等信息保存到上面说的CellInfo类中?。
2.例如叫做AllCellInfo,然后里面有个属性是List<CellInfo>  CellInfoList,然后用这个CellInfoList保存你每一个CellInfo 。能把这个类。和怎么保存每一个CELLINFO的代码发下吗?
3、这里用XML序列化,将AllCellInfo序列化成XML。为什么是讲ALLCELLINFO序列化。不是应该把里面的属性。LIST<CELLINFO>序列化?
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(AllCellInfo));

            using (StringWriter sw = new StringWriter())

            {

                xmlSerializer.Serialize(sw, allCellInfo);

                return sw.ToString();

?这个步骤以后呢?我改怎么去把保存为XML到本地去?
4.为什么要使用序列化操作啊?
5.将Xml字符串反序列化为AllCellInfo实体有什么用?
6.保存完以后。我是直接调用OPEN方法打开XML文件吗?
请赐教。谢谢。高手请雄起啊
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-6 10:35:00
7#
原帖由 hyf3133862 于 2011-12-5 19:39:00 发表
你好。解决单元格框重复的问题可以发个代码我看下吗?还有是否可以再加个功能就是判断选中的区域是不是已经加过颜色的。如果有加过颜色的线就不加了。
保存的问题1.通过算法得到界面上所有显示出来的Cell之后,如何把Cell的Border、颜色等信息保存到上面说的CellInfo类中?。
2.例如叫做AllCellInfo,然后里面有个属性是List<CellInfo>  CellInfo


哥们,第一个问题,我已经把实现的步骤都说了,代码实在没时间给你写了,抱歉。
第二个问题,因为我看到你描述的需求,貌似是需要保存为XML,所以就提供了保存为XML的方案。而且,保存为XML无论是从数据准确性还是便捷性,都是最佳方式。
序列化以后,你可以把得到的文本保存到本地(用文件流保存),然后在你需要复用的地方,把XML反序列化得到实体,然后在操作实体里的信息。
我也不是什么高手,但我觉得如果我在上面写了那么多的代码的情况下,你还是没有明白我的意思,我觉得你还是应该自己多练习一下。直接把代码提供给你,第一对你的提升没有帮助,第二原谅我确实没时间。
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-6 10:35:00
8#
原帖由 hyf3133862 于 2011-12-5 19:39:00 发表
你好。解决单元格框重复的问题可以发个代码我看下吗?还有是否可以再加个功能就是判断选中的区域是不是已经加过颜色的。如果有加过颜色的线就不加了。
保存的问题1.通过算法得到界面上所有显示出来的Cell之后,如何把Cell的Border、颜色等信息保存到上面说的CellInfo类中?。
2.例如叫做AllCellInfo,然后里面有个属性是List<CellInfo>  CellInfo


哥们,第一个问题,我已经把实现的步骤都说了,代码实在没时间给你写了,抱歉。
第二个问题,因为我看到你描述的需求,貌似是需要保存为XML,所以就提供了保存为XML的方案。而且,保存为XML无论是从数据准确性还是便捷性,都是最佳方式。
序列化以后,你可以把得到的文本保存到本地(用文件流保存),然后在你需要复用的地方,把XML反序列化得到实体,然后在操作实体里的信息。
我也不是什么高手,但我觉得如果我在上面写了那么多的代码的情况下,你还是没有明白我的意思,我觉得你还是应该自己多练习一下。直接把代码提供给你,第一对你的提升没有帮助,第二原谅我确实没时间。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-6 11:05:00
9#

回复 8# laonawuli 的帖子

再次感谢 laonawuli 的大力支持:-D ~
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-6 11:06:00
10#
hyf3133862 你好,这是我写的设置 CellRange 边框的一个简单的 Demo,其中判断选中的区域是不是已经加过颜色给出了思路,需要你自己去完善:

Demo 下载:
2798.zip (60.97 KB, 下载次数: 724)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部