编辑器指派到个别单元格
有时,在同一列中的每个单元格并非都有相同的类型,并且在这些情况下可能需要把不同的编辑器指派到同一列中的不同单元格。要把编辑器指派到个别单元格,则接管TreeList.CustomNodeCellEdit 事件。在接管此事件时,需要为每个个别单元格提供表示内置编辑器的特定的“repository 项”。注意,所使用的“repository 项”必须被添加到 TreeList 的内部或外部存储库中。
下面的插图显示了编辑器被指派到个别单元格时的 XtraTreeList 控件。
在默认情况下,通过TreeListColumn.ColumnEdit属性或TreeList.CustomNodeCellEdit事件指派到单元格的编辑器也被用于编辑该单元格的内容。如果需要把不同的编辑器用于内置编辑,则接管TreeList.CustomNodeCellEditForEditing事件。
示例
下面的示例代码接管了TreeList.CustomNodeCellEdit事件,进而指派了用于编辑两个节点的单元格取值的微调编辑器和复选编辑器。假设这些编辑器已经被添加到了树状列表的存储库中。
下面的插图展示了运行结果。
C#
复制代码
using DevExpress.XtraTreeList;
private void treeList1_CustomNodeCellEdit(object sender, GetCustomNodeCellEditEventArgs e) {
// Custom editors are assigned to all node cells except
// for cells that reside within the "Category" column.
if(e.Column.FieldName != "Category") {
// Obtain the record's first field value.
switch(e.Node.GetValue(0).ToString()) {
// A spin editor is assigned to the cells of the "Units in Stock" row.
case "Units in Stock":
e.RepositoryItem = repositoryItemSpinEdit1;
break;
// A check editor is assigned to the cells of the "Discontinued" row.
case "Discontinued":
e.RepositoryItem = repositoryItemCheckEdit1;
break;
}
}
}
Windows 窗体组件>产品>XtraEditors>自定义编辑器
本文档提供了关于创建自定义编辑器的总说明,这些自定义编辑器可以独立使用,或者作为内置编辑器 (例如在 XtraGrid 中)。可以参阅编辑器的类结构章节,该章节描述了 XtraEditors 库中所使用的并且自定义编辑器必须遵循的对象模型。
总说明
创建自定义编辑器包括三个步骤:
∙创建一个实现了特定行为的自定义编辑器类
如果需要为编辑器实现全新的功能,那么可以继承于 XtraEditors 库中所有编辑器的始祖
BaseEdit类。如果所创建的编辑器与某个现有的编辑器有共同之处,那么可以继承于适当的编辑器。关于包含在此库中的编辑器的信息,请参阅编辑器的层次结构主题。
∙创建一个存储编辑器特定属性的自定义repository 项类
在 XtraEditors 库中的每个编辑器都有一个被称为“repository 项”的关联对象,并且存储了编辑器的特定设置和事件处理程序。例如,DateEdit控件的设置通过
RepositoryItemDateEdit类被封装,而ImageComboBoxEdit编辑器的设置通过
RepositoryItemImageComboBox类提供,等等。所有 repository 项都派生于
RepositoryItem基类。
对每个自定义编辑器,都必须创建一个自定义的repository 项类。该类至少应该重写EditorTypeName属性。
另外,自定义的repository 项可以推出新设置、新事件,或者重定义默认设置的处理。如果编辑器派生于BaseEdit类,那么新repository 项应该派生于RepositoryItem类来创建。例如,如果创建DateEdit的子类,那么新repository 项应该继承于RepositoryItemDateEdit类,等等。
编辑器的Properties属性必须被重写,使得它能返回某个相应的 repository 项。
∙注册编辑器和repository 项。
每个编辑器都必须被注册到一个内部注册集合中,以便于此编辑器可以通过
PersistentRepository组件或任一容器控件 (XtraGrid、XtraBars 等) 进行访问。注册代码必须放置在 repository 项类的某个静态方法中。
关于这一点的更多细节在下面给出。
通常把实现自定义编辑器的代码放置在一个独立库中。例如,在编译此库之后,可以使用项目->添加引用菜单命令把它添加到应用程序项目中。然后,此自定义编辑器可以通过PersistentRepository的设计器或任一容器控件的设计器进行访问。
注意
仅当第一次打开设计器时,设计器才会搜索附属于应用程序的自定义编辑器。因此,如果打开了设计器,然后把引用添加到编辑器库,那么在下次打开设计器之时,此编辑器也不会被显示。在那种情况下,需要重新加载应用程序来查看已经被添加的自定义编辑器。
自定义编辑器类
每个自定义编辑器都应该重写EditorTypeName属性,并且返回一个唯一名称来标识此控件,让它与XtraEditors库中的已有编辑器相区别。此属性返回的字符串应该与对应repository 项的EditorTypeName属性的返回结果相匹配,也应该与在把此编辑器注册到XtraEditors库中时所使用的字符串相匹配(请参阅下面)。
如果为编辑器新建了一个 repository 项类,那么必须重写此编辑器的Properties属性。仅应该重写get方法,且此方法必须只返回基础类的Properties、其对象类型转换为相应的 repository 项类型。注意,Properties属性值不需要人工创建。根据注册信息,一个相应的对象会被自动创建。
自定义编辑器也必须提供一个调用注册代码的静态构造函数。请参阅下面的示例。
自定义 Repository 项类
对repository 项,需要重写EditorTypeName属性,此属性应该返回一个唯一名称来标识对应的编辑器。名称必须与编辑器的EditorTypeName属性的返回值相匹配,EditorTypeName主要供内部使用。在设计时刻的特定情况下也有用(例如,在PersistentRepository编辑器中)。在注册此编辑器时,也应该提供与EditorTypeName属性值相同的字符串(请参阅下面)。
Repository 项类必须包含一个调用了注册代码的静态构造函数。注册代码必须放置在一个独立的静态方法中。
如果需要为 repository 项添加新属性或新事件,那么需要重写Assign方法。必须把作为此方法的参数传递的 repository 项的设置,复制到当前的项。
注册
必须把注册新编辑器的代码放置到repository 项类中独立的静态方法中。注册代码把自定义编辑器链接到相应的repository 项、视图信息和绘制程序对象。在创建独立编辑器和内置编辑器时都要使用这些信息。
如上所述,自定义编辑器和 repository 项都必须包含调用注册方法的静态构造函数。
对repository 项类,必须添加下列属性:[UserRepositoryItem("RegisterCustomEdit")],其中“Register
CustomEdit”是静态的注册方法的名称。
要提供关于自定义编辑器的注册信息,必须创建一个marquee marquee
DevExpress.XtraEditors.Registrator.EditorClassInfo对象。可以使用该类的构造函数的重载,来提供注册信息:
C#
复制代码
publicEditorClassInfo(
string name, // Specifies the editor's name.
Type editorType, // Specifies the type of the editor class.
Type repositoryType, // Specifies the type of the custom repository item class. Type viewInfoType, // Specifies the type of the editor's ViewInfo class.
BaseEditPainter painter,// An instance of the editor's Painter class. booldesignTimeVisible, // Specifie
s whether the custom editor
// will be visible at design time within container controls
// (for instance, when creating an in-place editor
// within the XtraGrid or XtraBars).
Image image, // Specifies the image that will be displayed along
// with the editor's name within container controls.
Type accessibleType// Specifies the type of the object
// that provides accessibility information.
);
通常,需要把viewInfoType和accessibleType参数设置为与自定义编辑器的祖先相应的ViewInfo 和 AccessibilityInformation 类型。对于painter参数,需要指定相应的 Painter 类的某个实例。下表说明了这些与 XtraEditors 库中特定的标准编辑器相应的类:
编辑器
ViewInfo类
(DevExpress.XtraEditors.ViewIn
fo命名空间)
Painter 类
(DevExpress.XtraEditors.Drawi
ng命名空间)
AccessibilityInformatio
n类
(DevExpress.Accessibilit
y命名空间)
BaseEdit BaseEditViewInfo BaseEditPainter BaseEditAccessible
ButtonEdit ButtonEditViewInfo ButtonEditPainter ButtonEditAccessible CalcEdit CalcEditViewInfo ButtonEditPainter PopupEditAccessible CheckedComboBoxEdit PopupContainerEditViewInfo ButtonEditPainter PopupEditAccessible CheckEdit CheckEditViewInfo CheckEditPainter CheckEditAccessible ColorEdit ColorEditViewInfo ColorEditPainter PopupEditAccessible ComboBoxEdit ComboBoxViewInfo ButtonEditPainter PopupEditAccessible DateEdit DateEditViewInfo ButtonEditPainter PopupEditAccessible FontEdit ComboBoxViewInfo ButtonEditPainter PopupEditAccessible GridLookUpEdit GridLookUpEditBaseViewInfo ButtonEditPainter PopupEditAccessible HyperLinkEdit HyperLinkEditViewInfo HyperLinkEditPainter ButtonEditAccessible ImageComboBoxEdit ImageComboBoxEditViewInfo ImageComboBoxEditPainter PopupEditAccessible ImageEdit ImageEditViewInfo BlobBaseEditPainter PopupEditAccessible LookUpEdit LookUpEditViewInfo ButtonEditPainter PopupEditAccessible
MarqueeProgressBarContr
ol
MarqueeProgressBarViewInfo ProgressBarPainter ProgressBarAccessible MemoEdit MemoEditViewInfo MemoEditPainter TextEditAccessible MemoExEdit MemoExEditViewInfo BlobBaseEditPainter PopupEditAccessible
MRUEdit MRUEditViewInfo ButtonEditPainter PopupEditAccessible
PictureEdit PictureEditViewInfo PictureEditPainter BaseEditAccessible PopupContainerEdit PopupContainerEditViewInfo ButtonEditPainter PopupEditAccessible ProgressBarControl ProgressBarViewInfo ProgressBarPainter ProgressBarAccessible RadioGroup RadioGroupViewInfo RadioGroupPainter RadioGroupAccessible
RangeTrackBarControl RangeTrackBarViewInfo RangeTrackBarPainter RangeTrackBarAccessibl
e
SpinEdit BaseSpinEditViewInfo ButtonEditPainter BaseSpinEditAccessible TextEdit TextEditViewInfo TextEditPainter TextEditAccessible TimeEdit BaseSpinEditViewInfo ButtonEditPainter BaseSpinEditAccessible TrackBarControl TrackBarViewInfo TrackBarPainter TrackBarAccessible
ZoomTrackBarControl ZoomTrackBarViewInfo ZoomTrackBarPainter ZoomTrackBarAccessibl
e
在创建EditorClassInfo之后,需要把它添加到
DevExpress.XtraEditors.Registrator.EditorRegistrationInfo.Default.Editors静态集合中。请参阅下面的创建一个自定义编辑器的示例代码。
示例
让我们考虑一个创建自定义编辑器 (CustomEdit) 的简单示例,来呈现TextEdit类的子类。新的repository 项类是RepositoryItemCustomEdit。为了达到举例说明的目的,引入了一个新属性(UseDefaultMode)。
C#
复制代码
usingSystem.Drawing;
usingSystem.Reflection;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingDevExpress.XtraEditors;
usingDevExpress.XtraEditors.Repository;
usingDevExpress.XtraEditors.Registrator;
usingDevExpress.XtraEditors.Drawing;
usingDevExpress.XtraEditors.ViewInfo;
namespaceDevExpress.CustomEditors {
//The attribute that points to the registration method
[UserRepositoryItem("RegisterCustomEdit")]
publicclassRepositoryItemCustomEdit : RepositoryItemTextEdit {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论