CurionLib 动态数据录入表单





5.00/5 (20投票s)
动态数据表单。
引言
CurionLib 的一项功能可以相对快速地创建简单的表单。在简单的情况下,其数据与控件匹配,界面就会弹出。它支持编辑单个对象以及对象集合。它相当可扩展,并且可以进行大量的设计时和运行时定制。
本文档和另外两篇文章包含在库的文档目录中。
有四个示例应用程序。Demo.plain 和 Demo.mui 使用 Demo.common,内容相同。Demo.plain 的样式很少。Demo.mui 使用 Modern.UI 进行样式设置。Demo.designer 展示了可用于自定义表单的几项设置。Demo.tiny 是一个小型应用程序,比下面的示例应用程序更进一步。它展示了如何使用集合、导航、添加、删除和自定义命令。 
 
 
 
入门
正如人们常说的,证据在于细节。那么,要启动一个表单到底需要什么?
- 添加对 CurionLib.dll 的引用。
- 将 ItemForm控件添加到 Window 或 User Control 中。- 如果要添加很多控件,可以通过右键单击、选择“选择项”并选择 CurionLib.dll 来将控件添加到工具箱。一旦进入工具箱,就可以直接将其拖放到表单上。
- 在定义中添加一个 namespace。xmlns:curion="http://curion.net/Forms" 添加表单。 <curion:ItemForm x:Name="ctlForm" /> 
 
- 创建一个类。
- 将 ctlForm.DataContext设置为类的实例。
这是完整的 Window。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:curion="http://curion.net/Forms"
x:Class="MainWindow"
Title="MainWindow" Height="140" Width="320">
<Grid>
<curion:ItemForm x:Name="ctlForm" />
</Grid>
</Window>
这是一个快速示例类。
Class Person
Public Property Name As String
Public Property Age As Integer
Public Sub Hello()
MsgBox(String.Format("Hello {0}.  I see you're {1} years old.", Name, Age))
End Sub
End Class
以及表单上的代码。
Class MainWindow 
Sub New()
InitializeComponent()
ctlForm.DataContext = New Person
End Sub
End Class
如果一切顺利,运行应用程序时您应该会看到类似如下的内容。

输入您的姓名和年龄,然后单击“Hello”按钮,您应该会看到一个消息框,确认您的姓名和年龄。
继续深入,Demo.tiny 通过使用人员集合、添加导航、添加、删除和显示当前记录内容来扩展示例。它看起来是这样的。
 
我知道你可能在想,这些并不太令人兴奋。好消息是,这个控件还有更多功能,请稍等。
Organization
代码分为几个命名空间。
- Curion.WPF.Controls- 大多数控件。- ActionStack- 一个自定义控件类,它从匿名方法创建按钮列表。
- CommandStack- 一个自定义控件类,它为- CommandSource中的每个无参数方法创建一个按钮列表。
- ContextDefaults- 一个类,用于本地化- Defaults的更改。旨在用于- Using块中,以临时更改默认值,例如在创建表单时。
- DynamicCommand- 为- CommandSource中的每个无参数方法创建一个命令,该命令可以通过名称执行。
- Filter- 一个自定义控件类,不打算直接使用。它是一个- ICollectionView的过滤器控件,由一个- Textbox(过滤器)、一个- TextBlock(项目计数)和一个- CommandStack(可选的执行操作的按钮)组成。
- FilterList- 一个自定义控件类,根据输入的文本过滤- ListBox中的项目。
- MappedContentButton- 一个工厂类,用于创建按钮,并可选择使用映射值或函数来创建按钮内容。
- MemoryDefaults- 一个实现- IDefaults的类。一个基于内存的- Defaults实现,用于为各种类提供初始值。
- mSupport- 一些共享支持例程。
- MyCornerRadiusConverter- 将圆角半径转换为 1、2 或 4 个值,反之亦然。
- MyGridLengthConverter- 将 GridLength 转换为字符串,反之亦然。支持 A=Auto、#*=Star 长度、#=Pixels。
- MyThicknessConverter- 将 Thickness 转换为 1、2 或 4 个字符串值,反之亦然。
- NamedBrushConverter- 将使用十六进制、颜色名称和 Windows 系统颜色名称的纯色画笔转换为字符串,反之亦然。
- NamedColorConverter- 将使用十六进制、颜色名称和 Windows 系统颜色名称的颜色转换为字符串,反之亦然。
- SimpleButton- 一个工厂类,用于创建基本按钮。
- StringTitleConverter- 将逗号分隔的对齐方式和文本转换为 FrameworkElement,反之亦然。例如:Center,My Title 或 Right,My Title。
 
- Curion.WPF.Controls.Form- 表单控件使用的类。- BooleanCheckBoxColumnFactory- 一个工厂类,用于创建复选框控件。
- BooleanToggleColumnFactory- 一个工厂类,用于创建切换按钮控件。
- BorderColumnFactory- 一个工厂类,用于创建边框控件。
- ButtonColumnFactory- 一个工厂类,用于创建按钮控件。
- ColorColumnFactory- 一个工厂类,用于创建颜色文本框控件。
- ComboBoxColumnFactory- 一个工厂类,用于创建组合框控件。
- CornerRadiusColumnFactory- 一个工厂类,用于创建圆角半径文本框控件。
- DateColumnFactory- 一个工厂类,用于创建日期选择器控件。
- DecimalColumnFactory- 一个工厂类,用于创建十进制文本框控件。
- DoubleColumnFactory- 一个工厂类,用于创建双精度浮点数文本框控件。
- ExpanderColumnFactory- 一个工厂类,用于创建扩展器控件。
- GridLengthColumnFactory- 一个工厂类,用于创建 GridLength 文本框控件。
- GroupBoxColumnFactory- 一个工厂类,用于创建组框控件。
- HeadingColumnFactory- 一个工厂类,用于创建标题控件。
- HorizontalAlignmentColumnFactory- 一个工厂类,用于创建水平对齐组合框控件。
- ImageColumnFactory- 一个工厂类,用于创建图像控件。
- IntegerColumnFactory- 一个工厂类,用于创建整数文本框控件。
- IntegerSliderColumnFactory- 一个工厂类,用于创建整数滑块控件。
- ItemForm- 一个用于单个项目表单的自定义控件类。
- ItemsForm- 一个用于包含项目集合的表单的自定义控件类。
- ListBoxColumnFactory- 一个工厂类,用于创建列表框控件。
- LongColumnFactory- 一个工厂类,用于创建长整型控件。
- MakeCsvColumns- 一个工厂类,它为每个读/写属性创建一个控件工厂列表,使用映射器匹配逗号分隔值列表。
- MakeCsvForm- 一个工厂类,它使用逐行逗号分隔值布局来布局表单控件。逗号分隔值布局允许在同一行放置多个控件。可能包含标题,并使用逗号分隔值布局放置标题(- #)、水平线(- -)、空行(- _)、按钮(- {[-|+|*][header=]methodName})和列(- columnName[=width])。
- MakeSimpleColumns- 一个工厂类,它为每个读/写属性创建控件工厂列表,使用映射器。
- MakeSimpleForm- 一个工厂类,它从上到下布局表单控件。如果指定了标题,则可能包含标题,并(默认在顶部)在表单上布局按钮。与 MakeCsvColumns 结合使用,以限制显示的列或更改提示。
- MakeSimpleHeader- 一个工厂类,它创建一个标签用于表单上的标题。
- MakeXmlForm- 一个工厂类,它使用简单的 XML 布局来布局控件。XML 布局允许创建带边框的区域。区域(- group)可以按垂直或水平方向(- columns)排列,并通过使用逗号分隔值布局(- csv)将控件放置在区域内。区域可以是- GroupBox、- Expander、- Border或- Clear(无装饰)区域。逗号分隔值布局来自- MakeCsvForm。
- ManageArrayItems- 管理 Array 集合的添加、删除和视图检索。
- ManageArrayListItems- 管理 ArrayList 集合的添加、删除和视图检索。
- ManageClassColumns- 管理对象的列列表检索、列类型获取以及列值获取和设置。
- ManageCollectionItems- 管理 Collection 集合的添加、删除和视图检索。
- ManageCollectionView- 管理 CollectionView 集合的添加、删除和视图检索。
- ManageDataListItems- 管理 Curion DataList 集合的添加、删除和视图检索。
- ManageDataListRowColumns- 管理 Curion DataList 行的列列表检索、列类型获取以及列值获取和设置。
- ManageDataRowColumns- 管理 DataRow 的列列表检索、列类型获取以及列值获取和设置。
- ManageDataTableItems- 管理 DataTable 集合的添加、删除和视图检索。
- ManageDataViewItems- 管理 DataView 集合的添加、删除和视图检索。
- ManageDictionaryColumns- 管理字典值的列列表检索、列类型获取以及列值获取和设置。
- ManageDynamicObjectColumns- 管理动态对象的列列表检索、列类型获取以及列值获取和设置。
- ManageExpandoObjectColumns- 管理 ExpandoObject 的列列表检索、列类型获取以及列值获取和设置。
- ManageGenericItems- 管理泛型集合(即 List(Of Type)、ObservableCollection(Of Type) 等)的添加、删除和视图检索。
- MarginConverter- 将边距转换为 1、2 或 4 个字符串值,反之亦然。
- MemoColumnFactory- 一个工厂类,用于创建备忘录字段控件。
- SelectIManageColumns- 选择列管理器。
- SelectIManageItems- 选择集合/项目管理器。
- SingleColumnFactory- 一个工厂类,用于创建单个文本框控件。
- SolidBrushColumnFactory- 一个工厂类,用于创建纯色画笔文本框控件。
- StringTitleColumnFactory- 一个工厂类,用于从文本和对齐方式创建标题文本块控件。
- SuspendFormGeneration- 一个类,用于挂起表单生成,旨在在初始配置表单时使用- using块。
- TextBoxColumnFactory- 一个工厂类,用于创建文本框。
- ThicknessColumnFactory- 将 Thickness 转换为 1、2 或 4 个字符串值,反之亦然。
- DateRules,- DecimalRules,- DoubleRules,- IntegerRules,- LongRules,- SingleRules,- TextRules- 实现基本数据录入控件验证规则的类。
 这是表单类的快速参考:
- Curion.Data- 一些杂项数据类。- DataFilter- 一个数据类,提供列名、值和参数名。由- SQLTable用于过滤数据。
- Parameter- 一个数据类,提供列名和值。用于将参数传递给 SQL Server。
 
- Curion.Data.Sql- 一些 SQL Server 支持类。- SqlTable- 一个类,提供了一种简化的方法来为 SQL Server 表创建- DataList并保存更改。
- SqlSupport- 一个包含一些 SQL Server 支持例程的模块。
 
- Curion.Data.List- 支持- DataList的类。- DataList- 一个动态对象类,用法类似于- DataTable。
- Column- 一个类,表示- DataList中的一列。
- Row- 一个类,表示- DataList中的一行。
- ColumnCollection- 一个包含- DataList的- Column集合的类。
- RowCollection- 一个包含- DataList的- Row集合的类。
- CompareRow- 一个类,使用- OrderItem列表比较- DataList的两个行。用于对- DataList进行排序。
- OrderItem- 一个类,用于跟踪列名和排序方向。用于对- DataList进行排序。
 

除了类之外,还有一些使用的接口。
- IMakeButton- 用于创建按钮的接口。由按钮创建类使用。- MappedContentButton和- SimpleButton实现了该接口。
- IMakeControl- 用于创建控件的接口。由- IMakeColumns接口使用。
- IFilterView- 用于过滤视图的接口。- FilterText和- View将被设置,然后检索- Filter谓词并用于过滤视图。由- ItemForm使用。- FilterViewFields实现了该接口。
- IDefaults- 一个接口,定义了如何访问 Defaults。- ContextDefaults和- MemoryDefaults实现了该接口。
- IMakeColumns- 用于创建列工厂的接口。- MakeSimpleColumns和- MakeCsvColumns是该接口的实现。
- IMakeForm- 用于创建表单工厂的接口。- MakeSimpleForm和- MakeCsvForm是该接口的实现。
- IMakeHeader- 用于创建标题工厂的接口。- MakeSimpleHeader是该接口的实现。
- IGetData- 用于检索数据的接口。- SqlTable是该接口的实现。
- IHandleChanges- 用于处理已更改数据的接口。- SqlTable是该接口的实现。
术语
以下是我使用的一些术语的含义。
- Defaults-- Defaults是一组用于驱动新类初始属性的值。- Defaults可以全局更改,也可以在有限范围内更改。
- Factory- 工厂是创建类、方法或值的类或方法。
- Mapper-- Mappers 选择要在特定上下文中使用的项。例如,在- MakeSimpleColumns类中,- ColumnMapper将数据类型映射到列工厂,- ColumnMapperException将特定列名映射到列工厂。在此应用程序中,大多数映射器将一个键(如数据类型或列名)映射到一个函数。使用匿名方法,这允许高度自定义工厂的实例化。
- Header- 通常显示在字段前面的提示。
- Column- 一个创建 .NET 控件的工厂。
它支持哪些内容?
ItemForm 设计用于处理单个对象。要使用单个对象,请设置 DataContext 属性。它被设计为与 POCO(普通 CLR 对象,即您的类)、ExpandoObject、DataRow、DataList Row、DynamicObject 或 Dictionary 一起使用。
ItemsForm 设计用于处理 ItemForm 支持的对象集合。要使用集合,请设置 ItemsSource 属性。View 属性将可用,它将返回当前正在使用的 ICollectionView 。
对于 POCO 集合,每个项可以是不同的类型,并且会为每个项创建一个新的 UI。虽然在某些情况下这可能非常酷,但缺点之一是 RepeatButtons 实际上效果不佳,因为它们会为每个新类/表单重新生成。
使用控件
有两个演示应用程序展示了控件的使用。DemoApp 是一个通常未进行样式设置的 WPF 应用程序,让您了解其开箱即用的外观。在可能的情况下,我使用了控件包装来扩展控件,而不是继承控件。结果是,使用您的主题来使用该控件应该相当容易。DemoAppMUI 是使用主题的示例,这里是 MUI 或 Modern.UI。
这两个应用程序在几个地方都使用了 Customer.xml。它是一个包含 1,000 个随机生成客户和几种数据类型的小型 XML 文件。
DemoApp
展示了使用单个对象、带有自定义分页控件的对象列表以及使用 ListBox 分页控件的对象列表。Madness 演示了使用包含多种类型的列表以及一个或多个方法。最后,Separate command object 演示了一些基本的总体表单自定义和使用映射内容按钮。
除 Madness 外,所有表单都使用 customer.xml 记录,可以通过选择应用程序左上角的相应选项按钮来显示为简单表单、逗号分隔值布局或 XML 布局表单。
DemoAppMUI
演示了使用主题的单个和多项目列表,这里由 mui 提供。显示的页面位于 Pages 文件夹中,组织方式大致与菜单相同。特别值得注意的是:
- Custom/CSV form,展示了许多功能,包括标题、列表框、选项和映射到枚举。
- Custom/List Nav 和 List Nav2,展示了自定义分隔符。
- Custom/MiscControls,展示了一个过滤列表框。
- 以及 utility,这是另一个类似于第一个示例的示例,它生成基本的依赖项属性。它还演示了创建默认按钮。
MakeCsvForm
MakeCsvForm 控件布局是高度可定制的控件之一。以下是行含义的快速概述。请注意,方括号 [] 中的文本是可选的,除非对于 CommandButton 另有说明。
- * - 创建一个重复按钮。不能与 + 或 - 前缀一起使用。
- + - 创建一个默认按钮。
- - - 创建一个取消按钮。
- # - 固定宽度(像素),例如,zipcode=80。
- #* - 比例宽度(像素)。例如:address=1*。
- A - 根据内容自动调整大小。
| #Heading | 显示一个标题。必须是行上的第一个条目,并且被视为该行上的唯一条目。 | 
| - (dash) | 绘制一条水平线。必须是行上的第一个条目,并且被视为该行上的唯一条目。 | 
| _ (underline) | 插入一个空行。必须是行上的第一个条目,并且被视为该行上的唯一条目。 | 
| {button1[,button2...]} | 在单行上放置一个或多个 CommandButtons(用于无参数方法的按钮)。在当前实现中,按钮将增长到 640 像素宽,然后换行。按钮可以具有以下前缀:此外,按钮的形式为  | 
| column1[=width][,column2...] | 在表单的某一行上放置一个或多个列。 column1 假定为当前对象中的列名。width 可以采用以下形式:如果省略,则假定宽度为 1*。 | 
DemoApp 使用以下布局:
Name,Phone=100
-
Address
City,State=50,Zipcode=80
-
Balance=100,Added=100,IsActive=23
{First,*Prior,*Next,Last,,Show}
更新 1.0.0.1
添加了 IntegerSlider、BooleanToggle、BorderColumn、ExpanderColumn、GroupBoxColumn、MakeXmlForm。两个重大更改:用于 CSV 布局的标题字符从 > 更改为 #,并且按钮生成器现在是一个工厂函数。其他杂项更改,请参阅 0Changes.txt 获取更多信息。
MakeXmlForm 添加了 MakeXmlForm。
- <cols [height="value"]> - 将子节点排列成列。
- <box [width="value"] [title="value"] [type="expander|groupbox|border|clear"] [isopen="true|false"]> - 将子节点分组到由 type 指定的框容器中。
- <csv [width="width"]> - 生成 CSV 布局。InnerText是 CSV 布局。
示例应用程序的 XML 布局。
<layout>
<cols>
<box title="Person" isopen="true" type="expander">
<csv>
Name,Phone=100
</csv>
</box>
<box title="Misc" width="214" isopen="true" type="expander">
<csv>
Balance=100
Added=100
IsActive=23
</csv>
</box>
</cols>
<box title="Address" type="expander">
<csv>
#Address
Address
City,State=50,Zipcode=80
</csv>
</box>
<csv>
_
{First,*Prior,*Next,Last,,Show}
</csv>
</layout>
更新 2.0.0.0
由于存在大量重大更改、标题更改以及将表单拆分为两个控件,因此将版本更改为 2.0。以下是部分更改,其余请参阅 0Changes.txt。
重大更改
- 将 IMakeColumn重命名为IMakeColumns,以阐明其预期用途。
- 将 ButtonMaker移至ItemForm。
- 在 MakeXmlForm中,将linegroup重命名为columns,将container重命名为box,将lines重命名为csv。
- 拆分并重命名了 DataForm。ItemForm具有DataContext,接受单个项。ItemsForm具有ItemsSource以及相关例程。使用控件时应该更清晰。
- IMakeColumns.Create的初始参数从- obj As Object更改为- base As ItemForm。这是为了方便重用- ItemForms返回列名列表和检索这些列值的能力。最终这也应该为编写列生成器提供更大的灵活性。
- 更新了 IMakeHeader接口的Create方法,以包含ItemForm和列名。这应该允许对标题进行更多自定义。
- 将命令按钮分隔符从 [] 更改为 {}。这应该使文档更容易阅读……
- 向 ItemForm添加了ColumnNames,返回当前DataContext对象的列名。
- 向 ItemForm添加了默认属性Item(columnName As String) As Object。可以获取/设置当前DataContext的属性值。
- 添加了 IMakeControl,并更新了列生成器(MakeCsvColumns、MakeSimpleColumns)以选择IMakeControl接口而不是BaseColumnFactory。
- 向 ItemsForm 添加了导航和 Add、Delete 功能。
- 为新的列类型添加了一些转换器和工厂。
- 添加了 IManageItems 和 ISelectManageItems 以处理集合导航、添加、删除和视图检索。
- 添加了 IManageColumns 和 ISelectMangeColumns 以处理列名、类型检索以及列值的获取和设置。


