




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1简介 SourceGrid 是一个完全以 C# 托管代码编写的 .NET Windows 窗体网格控件. SourceGrid 可用于显示或改变表格形式的数据。 SourceGrid 可用于绑定到一个数据源(以 DataView 为代表),或者直接建立每个单元格。 SourceGrid 仅使用托管代码(无API 或 Interop),可以用于任何与 .NET 2 兼容的环境中。2安装 要使用 SourceGrid,你必须有与.NET 2 兼容的开发环境(如Visual Studio 2005)。 要下载控件的最新版,请访问 /projects/sourcegrid. 解压缩该文件后,可参考项目中的这些程序集:SourceGrid.dll - SourceGrid 内核库 DevAge.Core.dll - 共用的辅助功能库 DevAge.Windows.Forms.dll - Windows 窗体库 SourceGrid.Extensions.dll - 可选库,有 SourceGrid 扩展功能(如DataGrid, PlanningGrid) 典型地,我总是建议把它们复制到与*.xml文件相同的位置,你可以在程序集相同的目录中找到,以便使用IDE的智能感应录入功能。打开你想要添加网格控件的表单,打开IDE的工具箱,工具箱-右键-选择项-浏览并增加 SourceGrid.dll 和 SourceGrid.Extensions.dll 程序集到IDE的工具箱中。这些程序集是运行时刻所需的,需要随同你的应用程序一起分发给最终用户。3SourceGrid 控件 有 2 种主要的控件包含在 SourceGrid.dll 程序集中:GridVirtual 控件 - 使用虚单元格(ICellVirtual)的网格控件 Grid 控件 - 使用实体单元格(ICell)的网格控件 因此有 2 种不同的基础对象:虚单元格和实体单元格。虚单元格是确定外观和行为,但不包含值的单元格。实体单元格与虚单元格有相同的属性,但也包含单元格的值,因此在网格中与特定位置相关联。在不需要显示大量单元格(典型地,应少于50,000 个单元格)时,可以使用任何类型的 Grid 控件。如果需要显示大量单元格,通常你必须使用一个派生于 GridVirtual 的控件。 典型地,在本文中,我将使用 Grid 控件,因为它更简单,尤其是作为简单的示例。但是,同样的代码基本上也能用于 GridVirtual 控件。Grid 控件也用作需要最大弹性的那些特殊的网格。拖动 Grid 控件到你的窗体中,就如同添加其它任何 .NET 控件一样,然后开始使用它。4基础示例 目前,SourceGrid 仅有少量的设计时刻支持,因此通常你必须人工编写代码操作网格。假定你已经有一个名为 grid1 的 Grid 控件,你可以在 Form.Load 事件中编写如下代码:grid1.BorderStyle = BorderStyle.FixedSingle;grid1.ColumnsCount = 3;grid1.FixedRows = 1;grid1.Rows.Insert(0);grid10,0 = new SourceGrid.Cells.ColumnHeader(String);grid10,1 = new SourceGrid.Cells.ColumnHeader(DateTime);grid10,2 = new SourceGrid.Cells.ColumnHeader(CheckBox);for (int r = 1; r 10; r+) grid1.Rows.Insert(r); grid1r,0 = new SourceGrid.Cells.Cell(Hello + r.ToString(), typeof(string); grid1r,1 = new SourceGrid.Cells.Cell(DateTime.Today, typeof(DateTime); grid1r,2 = new SourceGrid.Cells.CheckBox(null, true);grid1.AutoSizeCells();可以看到,你能像使用 2 维数组一样来使用 grid。 在上面的代码中,我已经设置了网格的边框,列数,固定行数,建立了一个标头行。对此标头,我使用了一种 ColumnHeader 单元格。我已经为每列使用了特定类型,从而以一种简单的外观建立了其他单元格。Cell 类自动为指定类型建立了一个适当的编辑器(在本例中为一个文本框和一个日期时间选择器)。对最后一列,我使用了一个复选框单元格(CheckBox cell),允许在单元格中直接显示复选框。每种单元格定义了它自己的可视外观和行为。建立的网格支持排序,可改变列宽和编辑单元格。下面是一些重要的功能:如果你想读取或改变单元格中的值,可以使用 grid1r,c.Value 属性, r 和 c 是单元格的行和列。 删除某行,可以编写代码如: grid1.Rows.Remove(r) 改变列宽,可以编写代码如: grid1.Columnsc.Width = 100 如果你想改变某些单元格的可视属性,你必须使用 View 类。 让我们看看下一个示例:grid1.BorderStyle = BorderStyle.FixedSingle;grid1.ColumnsCount = 3;grid1.FixedRows = 1;grid1.Rows.Insert(0);SourceGrid.Cells.Views.ColumnHeader boldHeader = new SourceGrid.Cells.Views.ColumnHeader();boldHeader.Font = new Font(grid1.Font, FontStyle.Bold | FontStyle.Underline);SourceGrid.Cells.Views.Cell yellowView = new SourceGrid.Cells.Views.Cell();yellowView.BackColor = Color.Yellow;SourceGrid.Cells.Views.CheckBox yellowViewCheck = new SourceGrid.Cells.Views.CheckBox();yellowViewCheck.BackColor = Color.Yellow;grid10, 0 = new SourceGrid.Cells.ColumnHeader(String);grid10, 0.View = boldHeader;grid10, 1 = new SourceGrid.Cells.ColumnHeader(DateTime);grid10, 1.View = boldHeader;grid10, 2 = new SourceGrid.Cells.ColumnHeader(CheckBox);grid10, 2.View = boldHeader;for (int r = 1; r 10; r+) grid1.Rows.Insert(r); grid1r, 0 = new SourceGrid.Cells.Cell(Hello + r.ToString(), typeof(string); grid1r, 0.View = yellowView; grid1r, 1 = new SourceGrid.Cells.Cell(DateTime.Today, typeof(DateTime); grid1r, 1.View = yellowView; grid1r, 2 = new SourceGrid.Cells.CheckBox(null, true); grid1r, 2.View = yellowViewCheck;我使用 FontStyle.Bold | FontStyle.Underline 建立了一个列标头外观,其中标准单元格的外观为黄色背景,复选框单元格的外观为黄色背景。然后我把它们的实例指派到了每个单元格的 View 属性中。 窗体看起来应该像下图所示的一样:你可以注意到,我已经为许多单元格指派了 View 类的同一个实例。这对于优化所耗用的系统资源是有用的。每个单元格可以有一个编辑器(Editor 属性) 相关。编辑器用于编辑单元格的值。你可以人工建立一个编辑类(参阅 SourceGrid.Cells.Editors 命名空间),或者使用 SourceGrid.Cells.Editors.Factory 类建立基于某种类型(Type)的编辑器。如果指定了Type 参数, 你也可以使用 Cell 构造函数自动调用 SourceGrid.Cells.Editors.Factory 。下面是一个示例,建立一些单元格,并且使用上面所述的某一种方法把单元格与编辑器相关联。/A DateTime editorgrid1r, c = new SourceGrid.Cells.Cell(DateTime.Today, typeof(DateTime);/A string editorgrid1r, c = new SourceGrid.Cells.Cell(Ciao, typeof(string);/A double editorgrid1r, c = new SourceGrid.Cells.Cell(58.4);grid1r, c.Editor = SourceGrid.Cells.Editors.Factory.Create(typeof(double);就像 View 类一样,编辑器也可以在一个或数个单元格之间被共用。现在,你可以开始使用 SourceGrid 工作了。5基础概念 51Grid 控件如果你需要最有弹性的, 简易而没有太多单元格的网格, Grid 控件是理想的选择. 事实上, 此控件中每个单元格都作为一个 .NET 类来描述, 因此也占用一定数量的资源. 此外, 这是唯一支持 RowSpan 和 ColumnSpan(单元格合并)功能的网格.在一个 Windows 窗体中Grid 控件是最普通不过的事. 这正如增加其他控件(如按钮, DataGrid)一样. 首先,建立或者打开一个Windows 应用程序项目, 然后从设计器打开一个 Windows 窗体。 现在你要准备好使定制工具箱: 以鼠标右键单击“工具箱 .NET Framework 组件 浏览”,选中“DevAge.SourceGrid.dll”。现在,网格控件被添加到工具箱中,可以像其他控件一样增加到 Windows 窗体中。在增加控件到窗体后,我们就可以开始编写代码使用网格控件. 例如,在窗体的 Load 事件中,编写如下代码:grid1.Redim(2, 2);grid10,0 = new SourceGrid.Cells.Cell(Hello from Cell 0,0);grid11,0 = new SourceGrid.Cells.Cell(Hello from Cell 1,0);grid10,1 = new SourceGrid.Cells.Cell(Hello from Cell 0,1);grid11,1 = new SourceGrid.Cells.Cell(Hello from Cell 1,1);上述代码建立一个 2 行 2 列(Redim 方法) 的表,以单元格装入各个位置。我已经使用了包含实体单元格的 SourceGrid.Cells 命令空间。可以使用 Value 属性读取特定单元格的值,就像这样: object val = grid11,0.Value;.52GridVirtual 控件当需要显示大量的单元格, 并且已经有可用的结构化数据(例如数据集, 数组, XML文档或其他数据结构)时, 使用 GridVirtual 控件是理想的选择. 除了自动排序(这是因为在复制任何外部数据结构的内容之前, grid 不能进行自动排列), 以及 RowSpan 和 ColumnSpan 这类允许单元格交叉跨越其它邻近单元格的功能(例如合并单元格功能)以外, 这种 GridVirtual 网格控件与 Grid 控件有同样的功能.另一个缺点是建立虚网格稍显困难.虚网格主要的概念是, 每个单元格从一个外部的数据结构读取和写入值, 以及网格不持有所有行和列, 而通常是直接从数据源中读取. 此观点以一个抽象的 GridVirtual 类实现, 并且有抽象的方法: CreateRowsObject, CreateColumnsObject 和 GetCell. 你可以使用特定的 IValueModel (接口)直接从数据源中读取值. 因此对于 GridVirtual , 需要建立一个派生于 GridVirtual 的类, 并且定制 CreateRowsObject, CreateColumnsObject 和 GetCell 方法读取数据源是首要的. GetCell 方法的主要目的是返回一个给定的位置(行或列), 选定的单元格, 以及用于建立列和行对象 CreateRowsObject 和 CreateColumnsObject 方法使用的数据源。这样允许很大的弹性, 因为你可以返回任何 ICellVirtual 给一个特定的类型; 举例来说, 当行号为 0 时, 你可以返回单元格的标头类型.通常, 你不需要直接使用 GridVirtual , 而是需要使用一个从它派生的控件. 目前, 我已经完成两个可以直接使用虚网格功能的控件:DataGrid - 绑定到 DataView 对象的网格. ArrayGrid - 绑定到一个 Array 对象的网格 如果你需要建立自定义控件, 从特定数据源读取数据, 你可以参阅 ArrayGrid 类的示例.6单元格概述每个单元格由 4 个基本部分组成, 它们基于改进的“模式-外观-控制器(Model-View-Controller)”模型:模式(Model): 模式是管理单元格取值的类, 它包含相关的取值或属性, 并且与其他组件相联系. 外观(View) : 外观是绘制单元格, 并包含可视属性的类. 控制器(Controller) : 控制器是提供单元格行为的类. 编辑器(Editor) : 编辑器是定制单元格的编辑器的类. 这种划分为代码提供了很大的弹性和可重用性, 可节约时间, 为每种定制类型提供可靠的基础。 为了较通用的要求,一些类已经被准备和配置, 但是, 可能会需要以某些代码行建立个性化单元格。 61行和列 网格主要的组成是行和列. 为处理这些信息, SourceGrid 应用 2 个属性:Rows - 管理行信息, 基础类是 RowsBase 类. Columns - 管理行信息, 基础类是 ColumnsBase 类. 当使用一个实体网格时, 基础类被以 RowInfoCollection 和 ColumnInfoCollection 扩展, 它们是 RowInfo 类和 ColumnInfo 类的集合. 当使用一个虚网格时, 你必须以自己的代码提供数据源的信息, 从而扩展基础类.在实体网格上操作行和列注意: 仅对实体网格有效.这是 RowInfo 类的一部分属性: Height, Top, Bottom, Index, Tag. 与之相反, ColumnInfo 类的一部分属性为:Width, Left, Right, Index, Tag.有多种方式建立行和列:示例1:grid1.Redim(2,2);示例2:grid1.RowsCount = 2;grid1.ColumnsCount = 2;示例3:grid1.Rows.Insert(0);grid1.Rows.Insert(1);grid1.Columns.Insert(0);grid1.Columns.Insert(1);上面这三个示例完成同样的任务: 建立一个 2 行 2 列的表.可以使用下列代码改变行或列的宽度或高度:grid1.Rows0.Height = 100;grid1.Columns0.Width = 100;使用行或列的宽度及高度时, 属性 Top, Bottom, Left 和 Right 被自动计算.在分配行和列后, 你必须为网格建立所需单元格的各个位置, 就像这些代码一样:grid1.Redim(2,2);grid10, 0 = new SourceGrid.Cells.Cell(Cell 0, 0);grid11, 0 = new SourceGrid.Cells.Cell(Cell 1, 0);grid10, 1 = new SourceGrid.Cells.Cell(Cell 0, 1);grid11, 1 = new SourceGrid.Cells.Cell(Cell 1, 1);7模式(Model) 命名空间: SourceGrid.Cells.Models模式类(Model classes)的目的是把单元格对象和单元格数据分离出来, 这有两个主要的原因:在值只需要被存储在原始数据源的情况下, 执行虚网格。 在此情况下, 如果以正确的方式选择模式, 可以从数据源直接地读取数据。 需要扩充单元格类, 但是维持代码的易于重用性。 这是因为你不一定要改变基本的单元格类(Cell class)来增加新的功能,而是可以只增加一个新的模式。 每个单元格都有 Model 属性, 用于返回或设置一个 ModelContainer 对象. 此类是 IModel 接口的一个集合. 每个 IModel 接口包含所有用于特定功能的属性.主要的模式(Model) 是值模式(ValueModel), 包含单元格的值, 但也有其他模式供你建立定制的模式. 下面是默认的模式:IValueModel IToolTipText ICheckBox ISortableHeader 每种模式包含各自特定功能的属性, 例如 IToolTipText 包含提示条字符串.每个单元格都有一个模式的集合, 允许使用单个单元格上的众多功能.通常, 使用实体单元格时, 你可以使用一种模式简单实现以适当的接口直接存储所需的数据; 使用虚网格时, 你可以实现直接从外部数据源绑定值的接口.8外观(View)命名空间: SourceGrid.Cells.Views每个单元格都有一个 View 属性, 返回或设置一个 IView 类型的接口. 单元格使用此接口绘制和定制单元格的可视属性.外观(View)的目的是从代码的其余部分中把绘图代码分离出来, 并且允许在单元格之间共用相同的可视特性。 事实上,外观的同一实例可同时用于多个单元格, 这样, 可实现对系统资源使用的优化.在 SourceGrid.Cells.Views 命名空间中, 默认的外观类(View classes) 如下:SourceGrid.Cells.Views.Cell - 用于标准的单元格, 在此种外观下, 可以定制颜色, 字体, 边框和许多属性. SourceGrid.Cells.Views.Button - 用于按钮风格的单元格, 有主题(theme)支持. SourceGrid.Cells.Views.Link - 用于链接风格的单元格. SourceGrid.Cells.Views.CheckBox* - 用于复选框类型的单元格. 复选框可被选中, 禁止和包含标题文本. SourceGrid.Cells.Views.Header* - 用于一般的标头单元格. SourceGrid.Cells.Views.ColumnHeader* - 用于列标头单元格, 有主题(theme)支持. SourceGrid.Cells.Views.RowHeader - 用于行标头单元格, 有主题(theme)支持 SourceGrid.Cells.Views.MultiImages - 允许在单元格中绘制多个图像. *星号标识的外观需要特定的组件恰当工作, 例如复选框外观(CheckBox view)需要一个 ICheckBoxModel.上面的某些类包含一个或数个有便捷默认实例的静态属性.下面的代码演示如何建立一个外观类(View class), 改变单元格的某些属性, 并把它指派到上面建立的单元格中:SourceGrid.Cells.Views.Cell view = new SourceGrid.Cells.Views.Cell();view.BackColor = Color.Khaki;grid10,0.View = view;grid12,0.View = view;编写一些代码行,你可以建立定制的外观,在此情况下,建议从已经拥有某些默认方法的 Cell 派生类。 在下面的示例中,建立这样一个外观在单元格上绘制一个红色椭圆:public class MyView : SourceGrid.Cells.Views.Cellprotected override void DrawCell_Background(SourceGrid.Cells.ICellVirtual p_Cell, SourceGrid.Position p_CellPosition, PaintEventArgs e, Rectangle p_ClientRectangle)base.DrawCell_Background (p_Cell, p_CellPosition, e, p_ClientRectangle);e.Graphics.DrawEllipse(Pens.Red, p_ClientRectangle);以下列代码使用新的外观(View):MyView myView = new MyView();/填充网格代码grid1r, c.View = myView;9使用控制器(Controller) 命名空间: SourceGrid.Cells.Controllers每个单元格都有一个 Controller 属性,返回或设置为一个 ControllerContainer 对象. 该类是一个 IController 接口的集合。 通过使用多个事件(如Click, MouseDown, KeyPress, .), 每个 IController 接口都可以被用于扩展单元格行为.下面是默认的类:SourceGrid.Cells.Controllers.Cell - 单元格的共有行为. SourceGrid.Cells.Controllers.Button - 单元格作为按钮. SourceGrid.Cells.Controllers.CheckBox* - 单元格有复选框行为(需要 ICheckBox 模式) SourceGrid.Cells.Controllers.ColumnFocus - 当单击标头单元格时, 用于设置列的焦点. SourceGrid.Cells.Controllers.ColumnSelector - 当单击标头单元格时, 用于选中列. SourceGrid.Cells.Controllers.CustomEvents - 用于触发一系列事件, 而无须建立新的控制器 SourceGrid.Cells.Controllers.FullColumnSelection - 用于允许列选区模式. SourceGrid.Cells.Controllers.FullRowSelection - 用于允许行选区模式. SourceGrid.Cells.Controllers.MouseCursor - 用于显示在单元格上的鼠标指针. SourceGrid.Cells.Controllers.MouseInvalidate - 当接收到一个鼠标事件时, 用于使用单元格区失效. SourceGrid.Cells.Controllers.Resizable - 用于建立可调整大小(宽度和高度)的单元格. SourceGrid.Cells.Controllers.RowFocus - 当单击标头单元格时, 用于设置行的焦点. SourceGrid.Cells.Controllers.RowSelector - 当单击标头单元格时, 用于选中行. SourceGrid.Cells.Controllers.SortableHeader* - 用于建立可排序的列标头单元格(需要 ISortableHeader 模式) SourceGrid.Cells.Controllers.ToolTipText* - 用于建立带提示条的单元格(需要 IToolTipText 模式) SourceGrid.Cells.Controllers.Unselectable - 用于建立不可选的单元格. *星号标识的控制器(Controller), 需要特定的模式执行其任务.上面的某些类包含一个或数个有便捷默认实例的静态属性. 下面是可用于控制器内部的事件:鼠标事件: OnMouseDown, OnMouseUp, OnMouseMove, OnMouseEnter, OnMouseLeave 键盘事件: OnKeyUp, OnKeyDown, OnKeyPress 点击事件: OnDoubleClick, OnClick 焦点事件: OnFocusLeaving, OnFocusLeft, OnFocusEntering, OnFocusEntered, CanReceiveFocus 单元格取值事件: OnValueChanging, OnValueChanged 编辑事件: OnEditStarting, OnEditStarted, OnEditEnded 编写一些代码行,你可以建立定制的控制器(custom Controller),在此情况下,建议类从已经拥有某些默认方法的 ControllerBase 派生。 在下列示例中,当用户在单元格之上移动鼠标时,建立一个改变单元格背景色的一个控制器:public class MyController : SourceGrid.Cells.Controllers.ControllerBaseprivate SourceGrid.Cells.Views.Cell MouseEnterView = new SourceGrid.Cells.Views.Cell();private SourceGrid.Cells.Views.Cell MouseLeaveView = new SourceGrid.Cells.Views.Cell();public MyController()MouseEnterView.BackColor = Color.Green;public override void OnMouseEnter(SourceGrid.CellContext sender, EventArgs e)base.OnMouseEnter (sender, e);sender.Cell.View = MouseEnterView;sender.Grid.InvalidateCell(sender.Position);public override void OnMouseLeave(SourceGrid.CellContext sender, EventArgs e)base.OnMouseLeave (sender, e);sender.Cell.View = MouseLeaveView;sender.Grid.InvalidateCell(sender.Position);使用下面的代码, 在单元格格中使用新的控制器(Controller):MyController myController = new MyController();/. code to populate the gridgrid1r, c.AddController(myController);你也可以添加一个控制器到整个网格中, 实现把同一控制器应用到所有的单元格中:grid1.Controller.AddController(new MyController();考虑下面的示例: 每次当用户单击单元格时, 下面的控制器就打开一个对话框(显示单元格取值):class ClickController : SourceGrid.Cells.Controllers.ControllerBase public override void OnClick(SourceGrid.CellContext sender, EventArgs e) base.OnClick(sender, e); object val = sender.Value; if (val != null) MessageBox.Show(sender.Grid, val.ToString(); 你可以用下代码, 将此控制器添加到所有的单元格:grid1.Controller.AddController(new ClickController();下面是另一个实例, 演示当单元格改变时, 如何使用一个控制器检查, 它使用 OnValueChanged 事件:public class ValueChangedEvent : SourceGrid.Cells.Controllers.ControllerBase public override void OnValueChanged(SourceGrid.CellContext sender, EventArgs e) base.OnValueChanged(sender, e); string val = Value of cell 0 is 1; MessageBox.Show(sender.Grid, string.Format(val, sender.Position, sender.Value); 你可以用下列代码, 将此控制器添加到所有的单元格:grid1.Controller.AddController(new ValueChangedEvent();这样, 每次当单元格的值改变时, 上面的控制器就使用单元格的位置和新的取值, 显示出一个信息对话框.10使用编辑器(Editor) 命名空间: SourceGrid.Cells.Editors每个单元格都有属性 Editor ,用于返回或设置一个 EditorBase 对象。该类用于提供单元格编辑器。如果该属性为 null,则不允许编辑单元格。通常编辑器(Editor)使用 Model 类来管理必要的转换, 特别是字符串转换(用于描述单元格取值).下面是默认的类:ComboBox - 组合框编辑器. DateTimePicker - 日期时间选择编辑器 NumericUpDown - NumericUpDown 编辑. TextBox - 文本框编辑. 这是比较常用的编辑器, 可被所有支持字符串转换的类型调用(string, int, double, enum,.). TextBoxCurrency - 数值货币专用的文本框编辑器 TextBoxNumeric - 数值数据专用的文本框编辑器 . TimePicker - 时间值专用的 DateTimePicker 编辑器. TextBoxUITypeEditor - 提供给拥有 UITypeEditor 的全部类型单元格使用. 这是一个非常有用的类, 因为许多类型都支持该类: DateTime, Font, enums, 也可以建立自定义的 UITypeEditor. ImagePicker - 一个可用于选择图像文件并且编辑 byte 值的编辑器 在同一网格的多个单元格之间, 一个编辑器(Editor)可被共用; 举例来说,对一列中的每个单元格, 你可以使用同一个编辑器, 但是需要在同一网格中。每个编辑器类(Editor class)都有一个Control 属性, 返回用于编辑单元格的 Windows 窗体控件的一个实例. 你可以使用此实例来定制编辑器控件或实现高级功能.下面是建立一个可被编辑的单元格的方式:建立指定值类型的单元格. 这样, 单元格自动调用功能函数 SourceGrid.Cells.Editor.Factory.Create, 为指定类型或 null 返回一个有效的编辑器(Editor). /String cellgrid10, 0 = new SourceGrid.Cells.Cell(Hello, typeof(string);/Double cellgrid10, 1 = new SourceGrid.Cells.Cell(0.7, typeof(double);分别建立编辑器(Editor), 然后把它指派到单元格: /String editorSourceGrid.Cells.Editors.IEditor editorString = SourceGrid.Cells.Editor.Factory.Create(typeof(string);/Double editorSourceGrid.Cells.Editors.IEditor editorDouble = SourceGrid.Cells.Editor.Factory.Create(typeof(double);/String cellgrid10, 0 = new SourceGrid.Cells.Cell(Hello);grid10, 0.Editor = editorString;/Double cellgrid10, 1 = new SourceGrid.Cells.Cell(0.7);grid10, 1.Editor = editorDouble;当你需要为多个单元格使用相同的编辑器时, 推荐使用此方法。 人工建立适当的编辑器, 然后把它指派到单元格: SourceGrid.Cells.Editors.TextBox txtBox = new SourceGrid.Cells.Editors.TextBox(typeof(string);grid12,0.Editor = txtBox;如果你需要更强大的编辑器控件,或者有特别的需求时, 我建议人工建立编辑器.举例来说明在此种情况下,人工建立类 EditorTextBox , 然后设置属性 MaxLength./String 型编辑器SourceGrid.Cells.Editors.TextBox editorString = new SourceGrid.Cells.Editors.TextBox(typeof(string);editorString.Control.MaxLength = 10;/字符串单元格grid10, 0 = new SourceGrid.Cells.Cell(Hello);grid10, 0.Editor = editorString;编辑器也可以被用作定制单元格的格式, 在下面的代码中举例来说明(使用一种定制的数值格式):/Double 型编辑器SourceGrid.Cells.Editors.TextBoxNumeric editorDouble = new SourceGrid.Cells.Editors.TextBoxNumeric(typeof(double);editorDouble.TypeConverter = new DevAge.ComponentModel.Converter.NumberTypeConverter(typeof(double), #,#.00);/字符串单元格grid10, 0 = new SourceGrid.Cells.Cell(9419.3894);grid10, 0.Editor = editorDouble;我已经用 TypeConverter 属性定制了转换为字符串值, 以及从字符串转换的过程。 有许多其他的类型转换(TypeConverter)可用:DevAge.ComponentModel.Converter.NumberTypeConverter - 用于数值型, 如: double, decimal, int, float DevAge.ComponentModel.Converter.PercentTypeConverter - 用于以百分比格式表示的数值型, 如: double, decimal 和 float. DevAge.ComponentModel.Converter.CurrencyTypeConverter - 用于以货币格式表示的 Decimal 和 double 类型. DevAge.ComponentModel.Converter.DateTimeTypeConverter - DateTime 类型. 下面是建立定制格式的 DateTime 编辑器的另一个实例:/有定制格式的 DateTime 编辑器string dtParseFormats = new string dtFormat2 ;System.Globalization.DateTimeStyles dtStyles = System.Globalization.DateTimeStyles.AllowInnerWhite | System.Globalization.DateTimeStyles.AllowLeadingWhite | System.Globalization.DateTimeStyles.AllowTrailingWhite | System.Globalization.DateTimeStyles.AllowWhiteSpaces;TypeConverter dtConverter = new DevAge.ComponentModel.Converter.DateTimeTypeConverter(dtFormat2, dtParseFormats, dtStyles);SourceGrid.Cells.Editors.TextBoxUITypeEditor editorDt2 = new SourceGrid.Cells.Editors.TextBoxUITypeEditor(typeof(DateTime);editorDt2.TypeConverter = dtConverter;gridcurrentRow, 1 = new SourceGrid.Cells.Cell(DateTime.Today);gridcurrentRow, 1.Editor = editorDt2;下图表示大部份可用的编辑器和一些特定单元格(图片从例 3 取得):以用户控件或特定行为的少量代码行, 来建立一个定制的编辑器(Editor)是可行的。 你可以从 EditorControlBase 派生自定义类, 并建立任何 Windows 窗体控件。下面是使用 DateTimePicker 控件的一个编辑器的示例:public class DateTimePicker : EditorControlBasepublic DateTimePicker():base(typeof(System.DateTime)protected override Cont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025标准版劳务合同范本
- 2025年频谱分析仪项目申请报告模范
- 车间安全培训app课件
- 2025年新能源汽车试题及及答案
- 2025年年租赁合同范本大全
- 2025年含乳饮料项目提案报告
- 2025年工业互联网平台量子通信技术市场细分与竞争格局分析报告
- 2025年工业互联网平台传感器网络自组网技术在智慧城市公共资源优化配置中的应用
- 调蓄工程实施方案(3篇)
- 2025年学前教育信息化政策环境分析与应用前景报告
- 病人陪护考试题及答案
- 中医失眠治疗
- 2025年农业经济管理基础知识试卷及答案
- 2024年重庆万州公开招聘社区工作者考试试题答案解析
- 果树中级工试题及答案
- 2025-2030中国纳米薄膜市场未来发展战略与需求潜力调查研究报告
- 书写材料对书法创作的影响分析
- 2025专营销售代理合同范本
- 临床护理不良事件案例2025
- 儿科规培入科教育
- 监控维修培训
评论
0/150
提交评论