65.9K
CodeProject 正在变化。 阅读更多。
Home

CurionLib 动态数据录入表单

starIconstarIconstarIconstarIconstarIcon

5.00/5 (20投票s)

2013年7月26日

CPOL

16分钟阅读

viewsIcon

57239

downloadIcon

5671

动态数据表单。

引言

CurionLib 的一项功能可以相对快速地创建简单的表单。在简单的情况下,其数据与控件匹配,界面就会弹出。它支持编辑单个对象以及对象集合。它相当可扩展,并且可以进行大量的设计时和运行时定制。

本文档和另外两篇文章包含在库的文档目录中。

有四个示例应用程序。Demo.plain 和 Demo.mui 使用 Demo.common,内容相同。Demo.plain 的样式很少。Demo.mui 使用 Modern.UI 进行样式设置。Demo.designer 展示了可用于自定义表单的几项设置。Demo.tiny 是一个小型应用程序,比下面的示例应用程序更进一步。它展示了如何使用集合、导航、添加、删除和自定义命令。

入门

正如人们常说的,证据在于细节。那么,要启动一个表单到底需要什么?

  1. 添加对 CurionLib.dll 的引用。
  2. ItemForm 控件添加到 Window 或 User Control 中。
    • 如果要添加很多控件,可以通过右键单击、选择“选择项”并选择 CurionLib.dll 来将控件添加到工具箱。一旦进入工具箱,就可以直接将其拖放到表单上。
    • 在定义中添加一个 namespace
      xmlns:curion="http://curion.net/Forms"

      添加表单。

      <curion:ItemForm x:Name="ctlForm" />
  3. 创建一个类。
  4. 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)将控件放置在区域内。区域可以是 GroupBoxExpanderBorderClear (无装饰)区域。逗号分隔值布局来自 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 对象,即您的类)、ExpandoObjectDataRowDataList RowDynamicObjectDictionary 一起使用。

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 另有说明。

    #Heading 显示一个标题。必须是行上的第一个条目,并且被视为该行上的唯一条目。
    - (dash) 绘制一条水平线。必须是行上的第一个条目,并且被视为该行上的唯一条目。
    _ (underline) 插入一个空行。必须是行上的第一个条目,并且被视为该行上的唯一条目。
    {button1[,button2...]} 在单行上放置一个或多个 CommandButtons(用于无参数方法的按钮)。在当前实现中,按钮将增长到 640 像素宽,然后换行。按钮可以具有以下前缀:
    • * - 创建一个重复按钮。不能与 + 或 - 前缀一起使用。
    • + - 创建一个默认按钮。
    • - - 创建一个取消按钮。

    此外,按钮的形式为 header=columnName columnName。如果采用第二种形式,则会进行简单的驼峰式大小写转换。如果省略按钮名称,则插入空格(即,First,,Last)。使用多个逗号可以创建更大的间隔。必须是行上的第一个条目,并且被视为该行上的唯一条目。

    column1[=width][,column2...] 在表单的某一行上放置一个或多个列。column1 假定为当前对象中的列名。width 可以采用以下形式:
    • # - 固定宽度(像素),例如,zipcode=80。
    • #* - 比例宽度(像素)。例如:address=1*。
    • A - 根据内容自动调整大小。

    如果省略,则假定宽度为 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

添加了 IntegerSliderBooleanToggleBorderColumnExpanderColumnGroupBoxColumnMakeXmlForm。两个重大更改:用于 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 布局。
不直接位于 <columns> 标签下的节点假定位于后续行上。

示例应用程序的 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
  • 拆分并重命名了 DataFormItemForm 具有 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 ,并更新了列生成器(MakeCsvColumnsMakeSimpleColumns)以选择 IMakeControl 接口而不是 BaseColumnFactory
  • 向 ItemsForm 添加了导航和 Add、Delete 功能。
  • 为新的列类型添加了一些转换器和工厂。
  • 添加了 IManageItems 和 ISelectManageItems 以处理集合导航、添加、删除和视图检索。
  • 添加了 IManageColumns 和 ISelectMangeColumns 以处理列名、类型检索以及列值的获取和设置。

© . All rights reserved.