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
-Mapper
s 选择要在特定上下文中使用的项。例如,在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...]} | 在单行上放置一个或多个 CommandButton s(用于无参数方法的按钮)。在当前实现中,按钮将增长到 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 以处理列名、类型检索以及列值的获取和设置。