原帖由 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的数据,例如:然后:通过这个算法来取界面上显示出来的Cell(过滤掉那些被其他Span挡着的Cell),如果你希望保留所有Cell的信息,那就不用这个算法了。不管怎样,先给你:- /// <summary>
- /// 获得当前显示出来的Cell。被其他SpanCell挡住的Cell不被获得。
- /// </summary>
- private void GetVisibleCell()
- {
- //所有当前显示出来的Cell。
- List<Cell> visibleCellList=new List<Cell>();
- //经典的循环。
- int rowCount = fpSpread1_Sheet1.RowCount;
- int columnCount = fpSpread1_Sheet1.ColumnCount;
- for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
- {
- for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
- {
- Cell cell = fpSpread1_Sheet1.Cells[rowIndex, columnIndex];
- FilterCell(visibleCellList, cell);
- }
- }
- MessageBox.Show(visibleCellList.Count.ToString());
- }
- /// <summary>
- /// 过滤Cell。如果cell没有被visibleCellList中的任何一个Cell挡住,则将cell添加进visibleCellList。
- /// </summary>
- /// <param name="visibleCellList">当前显示出来的Cell。</param>
- /// <param name="cell">被过滤的Cell。</param>
- private void FilterCell(List<Cell> visibleCellList, Cell cell)
- {
- //将Cell的位置转化为Point。
- Point p = new Point(cell.Column.Index, cell.Row.Index);
- foreach (Cell c in visibleCellList)
- {
- //将目前已经显示出来的Cell的位置与所占用的面积转化为Rectangle。
- Rectangle r = new Rectangle(c.Column.Index, c.Row.Index, c.ColumnSpan, c.RowSpan);
- //如果Rectangle包含Point,则说明cell已经被挡住了,则return。
- if (r.Contains(p))
- {
- return;
- }
- }
- //如果走到这一步了,说明cell没有被visibleCellList中的任何一个Cell挡住,则将cell添加进visibleCellList。
- visibleCellList.Add(cell);
- }
复制代码 通过算法得到界面上所有显示出来的Cell之后,你把这些Cell的Border、颜色等信息保存到上面说的CellInfo类中。
然后使用Xml序列化,将Cell的信息保存。
你需要新建一个类,例如叫做AllCellInfo,然后里面有个属性是List<CellInfo> CellInfoList,然后用这个CellInfoList保存你每一个CellInfo,然后用XML序列化,将AllCellInfo序列化成XML。
序列化方式:- /// <summary>
- /// 将AllCellInfo序列化为Xml字符串。
- /// </summary>
- /// <param name="allCellInfo">AllCellInfo实体。</param>
- /// <returns>Xml字符串。</returns>
- public static string Serialize(AllCellInfo allCellInfo)
- {
- XmlSerializer xmlSerializer = new XmlSerializer(typeof(AllCellInfo));
- using (StringWriter sw = new StringWriter())
- {
- xmlSerializer.Serialize(sw, allCellInfo);
- return sw.ToString();
- }
- }
复制代码 反序列化:- /// <summary>
- /// 将Xml字符串反序列化为AllCellInfo实体。
- /// </summary>
- /// <param name="xml">Xml字符串。</param>
- /// <returns>AllCellInfo实体。</returns>
- public static AllCellInfo Deserialize(string xml)
- {
- XmlSerializer xmlSerializer = new XmlSerializer(typeof(AllCellInfo));
- using (StringReader sr = new StringReader(xml))
- {
- AllCellInfo allCellInfo= xmlSerializer.Deserialize(sr) as AllCellInfo;
- return allCellInfo;
- }
- }
复制代码 OK~我能说的都在上面了~
为了对版主iceman连日来对我的帮助表示感谢,所以帮他回答了这个问题~ |