[C1] 仿 Excel 实现(C1FlexGrid)
一 分析阶段
根据 Excel 表格区域的划分,如下图,基本上以4行*3列的框架搭建;

第一行为列头区域 ==> C1FlexGrid.ColumnHeaders
第二行为单元格区域 ==> C1FlexGrid.Cells
第三行为列尾区域 ==> C1FlexGrid.ColumnFooters
第四行为横向滚动条区域,在 Excel 里还有工作簿页签等;
第一列为行头区域 ==> C1FlexGrid.RowHeaders
第二列为单元格区域
第三列为纵向滚动条区域;
在 CFlexGrid 里还有 BottomLeftCells,TopLeftCells 两个区域,楼主做了一个 Demo,然后把各个区域用背景色标识区域,如下图:

二 扩展 C1FlexGrid 框架
在 Silverlight 中新建一个模版化控件,

将该模版化控件继承于 C1FlexGrid,并在构造函数中默认初始化50行10列;代码如下:
public class SLFlexGridExt : C1FlexGrid
{
/// <summary>
/// 构造函数
/// </summary>
public SLFlexGridExt()
{
this.DefaultStyleKey = typeof(SLFlexGridExt) // 默认添加50行10列
for (int i = 0; i < 50; i++)
{
Rows.Add(new Row())
}
for (int c = 0; c < 10; c++)
{
Columns.Add(new Column())
}
}
}
接着在自动生成的 Themes/Generic.xaml 中对该模版化控件进行样式设置;
<!-- style for main control -->
<Style TargetType="local:SLFlexGridExt">
<!-- properties -->
<Setter Property="FontFamily" Value="Arial" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="RowBackground" Value="{StaticResource _RowBackground}" />
<Setter Property="AlternatingRowBackground" Value="{StaticResource _AlternatingRowBackground}" />
<Setter Property="HeaderGridLinesBrush" Value="{StaticResource _HeaderGridLinesBrush}" />
<Setter Property="GridLinesBrush" Value="{StaticResource _GridLinesBrush}" />
<Setter Property="FrozenLinesBrush" Value="{StaticResource _FrozenLinesBrush}" />
<Setter Property="GroupRowBackground" Value="{StaticResource _GroupRowBackground}" />
<Setter Property="CursorBackground" Value="{StaticResource _CursorBackground}" />
<Setter Property="SelectionBackground" Value="{StaticResource _SelectionBackground}" />
<Setter Property="RowHeaderBackground" Value="{StaticResource _RowHeaderBackground}" />
<Setter Property="ColumnHeaderBackground" Value="{StaticResource _ColumnHeaderBackground}" />
<Setter Property="TopLeftCellBackground" Value="{StaticResource _TopLeftCellBackground}" />
<Setter Property="BottomRightCellBackground" Value="{StaticResource _BottomRightCellBackground}" /> <!-- Excel behavior by default -->
<Setter Property="AllowDragging" Value="None" />
<Setter Property="AllowSorting" Value="False" />
<Setter Property="AllowResizing" Value="Both" />
<Setter Property="ShowMarquee" Value="True" />
<Setter Property="GridLinesVisibility" Value="All" />
<Setter Property="ClipboardCopyMode" Value="ExcludeHeader" />
<Setter Property="ClipboardPasteMode" Value="ExcludeHeader" />
<Setter Property="KeyActionTab" Value="MoveAcross" />
<Setter Property="AreRowGroupHeadersFrozen" Value="False" /> <Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:SLFlexGridExt">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<Grid x:Name="_root">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- vertical scrollbar -->
<ScrollBar x:Name="_sbV" Orientation="Vertical" Grid.Column="2" Grid.RowSpan="2" />
<!-- horizontal scrollbar -->
<ScrollBar x:Name="_sbH" Orientation="Horizontal" Grid.Row="3" Grid.ColumnSpan="3" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这样以后就可以在其他界面里添加该扩展的 C1FlexGrid 控件,
先添加该扩展控件所在命名空间:
xmlns:my="clr-namespace:Memento.SLFlexGrid;assembly=SLFlexGrid"
然后添加该控件
<my:SLFlexGridExt x:Name="flex" Grid.Row="2" Margin="0 4 0 0" />
即可,预览效果如下图:

现在还是跟未扩展前的 C1FlexGrid 差不多,
接下来就要像 Excel 那样,在左下角加入切换工作簿的两个按钮,和工作簿页签的 TabControl,以及添加新工作簿的按钮,

只要在之前扩展的基础上,修改 Themes/Generic.xaml,定义想要的样式布局即可:
<Grid x:Name="_tabHolder" Grid.Row="3" Grid.ColumnSpan="2" Background="DarkGray">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel x:Name="_spButtonPanel" Orientation="Horizontal">
<Button Height="20" Width="20" />
<RepeatButton Height="20" Width="20" />
<RepeatButton Height="20" Width="20" />
<Button Height="20" Width="20" />
</StackPanel>
<c1:C1TabControl x:Name="_tabs" Grid.Column="1" FontSize="12" Padding="0" Margin="0 -1 0 0" IsTabStop="False" TabItemShape="Sloped" TabStripPlacement="Bottom" TabStripOverlap="8" />
</Grid> <!-- horizontal scrollbar -->
<ScrollBar x:Name="_sbH" Orientation="Horizontal" Grid.Column="2" />
</Grid>
效果如下图,这里楼主是按照 ComponentOne 官网提供的 ExcelBook.5Demo 里的样式设计的,现在还未加上工作簿,所以中间是空白部分,左边的按钮可在后期定义为工作簿的切换,还有一个新增工作簿,看心情实现吧

[C1] 仿 Excel 实现(C1FlexGrid)的更多相关文章
- 浏览器仿EXCEL表格插件 - 智表ZCELL产品V1.4发布
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.2更新
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.1更新
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3发布
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格
目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...
- 网页版仿Excel效果组件--handsontable拓展运用
引言(祝看官们新年万事大吉) 前段时间项目需要实现网页版的excel表格功能,瞬间就想到了handsontable,为什么呢?理由如下:该UI组件功能齐全多样,展示效果也更贴近bootstrap风格, ...
- 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)
为什么呢,一个前端用的,类似EXCEL的操作的JS 插件,从头研发真的有必要吗?可能你会觉得没有必要吧,其实我自己也问过自己好多遍.因为业界有更加强大的spreadjs,也有比较轻型的JEXCEL,自 ...
- Handsontable-一款仿 Excel效果的表格插件使用总结 96
最近在做一个关于报表管理的项目,发现了一款很好用的jQuery插件-Handsontable.它真的特别给力,在 Excel 中可进行的操作,你几乎都可以在网页中做到,如拖动复制.Ctrl+C .Ct ...
- CSS 仿Excel表格功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- Angular企业级开发-AngularJS1.x学习路径
博客目录 有链接的表明已经完成了,其他的正在建设中. 1.AngularJS简介 2.搭建Angular开发环境 3.Angular MVC实现 4.[Angular项目目录结构] 5.[SPA介绍] ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- SQL Server2008R2 在windows8上安装,出现“兼容性”和 “执行未经授权的操作”的错误!
本人是windows8.1的操作系统,亲测安装成功 解决方法如下: 1.卸载干净sql Server2008r2,包括注册表内容,删除c盘下的安装路径! 2.关闭防火墙(这步很重要) 3.断开网络连接 ...
- web 前端(轮番插件)
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...
- listview下拉刷新和上拉加载更多的多种实现方案
listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局 android系统为listview提供了addfootview ...
- Oracle 11g必须开启的服务及服务详细介绍
转自:http://www.educity.cn/shujuku/404120.html 成功安装Oracle 11g数据库后,你会发现自己电脑运行速度会变慢,配置较低的电脑甚至出现非常卡的状况,通 ...
- [PHP源码阅读]array_push和array_unshift函数
在PHP中,在数组中添加元素也是一种很常用的操作,分别有在数组尾部和头部添加元素,看看PHP内部是如何实现数组插入的操作. 我在github有对PHP源码更详细的注解.感兴趣的可以围观一下,给个sta ...
- MyBatis1:MyBatis入门
MyBatis是什么 MyBatis是什么,MyBatis的jar包中有它的官方文档,文档是这么描述MyBatis的: MyBatis is a first class persistence fra ...
- 在rem布局下使用背景图片以及sprite
现在移动端页面用rem布局已经是一大流派了,成熟的框架如淘宝的flexiable.js,以及我的好友@墨尘写的更轻量级的hotcss.用rem作单位使得元素能够自适应后,还有一块需要关注的,那就是背景 ...