视图以列来显示数据。 因此,当网格控件被绑定到数据源时,需要在视图内创建列,并把列绑定到数据字段。 否则,视图不显示数据。
列的创建与绑定基础
在 XtraGrid 内可用的所有视图都派生于 ColumnView 类。 该类实现了基本的列功能,并由其子类按需要扩展。 该类声明了 ColumnView.Columns 属性,此属性是视图所拥有的列的集合。 Columns 属性被 BandedGridView 和 LayoutView 类重写,因为这些类分别使用由 BandedGridColumn 和 LayoutViewColumn 对象表示的列。 在 GridView 和 CardView 视图中的列都通过 GridColumn 对象表示。 请参阅 列与卡片字段概述 来获知细节。
有两种方式来添加列并绑定到字段:
-
人工创建列并绑定到字段。
可以使用由视图的 Columns 属性所返回集合的方法来添加、删除和访问个别列。 在列被创建并添加到集合中之后,就可以使用 GridColumn.FieldName 属性把它绑定到数据字段。 该属性提供绑定到列的数据字段的名称。 如果视图被绑定到了数据,正如在 绑定控件到运行时刻创建的数据 主题中所述的那样,该属性指定了记录对象的公共属性的名称。 在设计时刻,可以使用适当的设计器页面来访问 Columns 集合。 请参阅下一部分来获知细节。
-
自动为已绑定数据源中的所有字段创建列。
视图允许把所有数据字段的对应的列一次性装载到 Columns 集合。 在运行时刻,通过调用视图的 ColumnView.PopulateColumns 方法来执行此操作。 下一部分描述了如何在设计时刻执行此操作。 注意,如果在应用程序启动时,视图没有包含列,则为视图自动调用 ColumnView.PopulateColumns 方法。
可以组合使用上述这两种方法。例如,可能需要显示除去某个数据字段之外的其他所有数据字段。 在这种情况下,最轻松的方式是自动装载所有列集合,然后删除不想要的列。
在设计时刻把列添加到 卡片视图、网格视图 或 带区网格视图 中时,该列被立即显示。 但是,在运行时刻通过 Add 方法添加列时,初始隐藏所添加的列。 可以通过 GridColumn.VisibleIndex 属性来使列可视。 要初始创建可视的列,则使用 GridColumnCollection.AddVisible 方法。 最终用户可以使用 “自定义”窗体 隐藏列或显示列。
高级带区网格视图 中的列有不同的规则。 它们在设计时刻也不立即被显示。 要在设计时刻显示这些列,则需要使用设计器的 Band(带区) 页面来使它们可视,操作方法是把它们拖动到适当的带区内。 在运行时刻,需要把列的 BandedGridColumn.OwnerBand 属性设置为所需的带区,并调用视图的 AdvBandedGridView.SetColumnPosition 方法。
布局视图 的行为与其他视图相似。 在设计时刻创建的列被自动设置为可视,而初始隐藏在代码中创建的列。 要在设计时刻指定列的布局,则使用设计器的 “Layout(布局)”页面。 在运行时刻,要把列放置到由 LayoutView.TemplateCard 属性表示的模板卡片内,则使用该列的 Visible 属性,或使用由相应的 LayoutViewColumn.LayoutViewField 对象提供的方法。
如果列的 GridColumn.FieldName 属性包含了空字符串,或者与相关数据源中的任何字段名称都不匹配,则该列不被绑定到数据字段。 这种列单元格始终为空白。 可以编辑这种列单元格,但是当编辑结束时键入的取值会消失。 但是要注意,这种列也可以用于达到显示目的。 可以使该列只读,并使用 自定义绘制 在它的单元格内显示信息。 换句话说,需要禁用该列的 OptionsColumn.AllowEdit 选项,并且接管视图的 GridView.CustomDrawCell 或 CardView.CustomDrawCardFieldValue 事件 (取决于视图的类型)。
在设计时刻创建和绑定列
在设计时刻,可以通过设计器的 “Columns(列)”页面 来访问 Columns 集合。 它允许操作列 (创建和移除列,从绑定数据源中取出列,以及访问列的设置)。 在列被创建之后,就可以定制它们的设置。 在设计器的 “Columns(列)”页面,选中特定的列在属性网格中显示其设置。
XtraGrid 控件提供了在窗体上访问列设置及带区设置的功能。 如果列/带区在设计时刻可视,则不需要激活设计器来访问其设置。 而是可以在窗体上单击列/带区的标头,这样就能在属性网格中显示该对象的属性和事件。 请参阅 定制带区和列 获得更多信息。
在运行时刻创建和绑定列
本示例展示了如何使用前面讨论的两种方法来添加列。 代码首先显示了一个有“Do you want to create columns for all fields?”的消息框。 如果按下了 Yes 按钮,则调用视图的 ColumnView.PopulateColumns 方法。 否则,ProductID、ProductName、QuantityPerUnit 和 UnitPrice 字段的列都使用 Columns 集合方法进行创建。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Base; ColumnView View = gridControl1.MainView as ColumnView; DialogResult answer = MessageBox.Show("Do you want to create columns for all fields?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (answer == DialogResult.Yes) View.PopulateColumns(); else { string[] fieldNames = new string[] {"ProductID", "ProductName", "QuantityPerUnit", "UnitPrice"}; DevExpress.XtraGrid.Columns.GridColumn column; View.Columns.Clear(); for (int i = 0; i < fieldNames.Length; i++) { column = View.Columns.AddField(fieldNames[i]); column.VisibleIndex = i; } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Base Dim View As ColumnView = GridControl1.MainView Dim Answer As DialogResult Answer = MessageBox.Show("Do you want to create columns for all fields?", "Confirmation", _ MessageBoxButtons.YesNo, MessageBoxIcon.Question) If Answer = DialogResult.Yes Then View.PopulateColumns() Else Dim FieldNames() As String = New String() {"ProductID", "ProductName", _ "QuantityPerUnit", "UnitPrice"} Dim I As Integer Dim Column As DevExpress.XtraGrid.Columns.GridColumn View.Columns.Clear() For I = 0 To FieldNames.Length - 1 Column = View.Columns.AddField(FieldNames(I)) Column.VisibleIndex = I Next End If |