一个“拆分”的网格使最终用户对相同的数据可以拥有多个视图
。例如
,假设有一个由十个字段组成的大表
。在这种情况下
,在控件中察看的记录集将有十列宽,除非窗体非常宽,否则用户将无法同时看见所有列的内容。更进一步,假设用户只对第一列和最后一列感兴趣(例如,第一列是名字,最后一列是电话号码)。为了能同时看到在两端的列(不重新安排列的顺序),可以对网格进行拆分。
创建一个Split对象
在设计时,可以创建一个拆分,具体步骤是:右键单击网格,单击“编辑”,再单击右键,然后单击“拆分”。通过右键单击该控件,并单击“属性”来显示“属性页”对话框,可以编辑这个拆分。可以使用“拆分”选项卡来自定义拆分。要删除一个拆分,右键单击该拆分,并单击“删除”。
在运行时,最终用户也可以通过单击位于这个网格控件的左下边的右边的选项卡,以手工方式来拆分该网格(除非不允许这个操作),如下图所示:
默认情况下,DataGrid控件包含一个Split对象。防止最终用户添加拆分的代码为:
DataGrid1.Splits(0).AllowSizing=False
在程序中添加和删除拆分
DataGrid控件包含一个Split对象的集合。要在程序中添加拆分,可以使用Add方法,如下所示:
DataGrid1.Splits.Add1
注意Add方法需要新的拆分索引作为其参数。要添加一个拆分,应将这个索引参数设置为Splits集合的Count属性值。
使用Split集合的Add方法,可以在程序中按照所实际需要添加拆分。由于添加多于两个以上的拆分将使网格很难使用,可以使用该集合的Count属性来限制拆分的数目。
IfDataGrid1.Splits.Count<3Then'添加一个拆分。
DataGrid1.Splits.AddDataGrid1.Splits.Count
EndIf
使拆分同步
当拆分多于一个时,可能希望控制这些拆分如何滚动。例如,在一个具有三个拆分的网格中,可以决定只让第一个和第三个拆分同步,而让中间的拆分独立地滚动。要同步任何两个(或多个)拆分,只需将每个Split对象的ScrollGroup属性设置为同一个值。
'使第一个和第三个Split对象同步。
WithDataGrid1
.Splits(0).ScrollGroup=1
.Splits(1).ScrollGroup=2
.Splits(2).ScrollGroup=1
EndWith
通过设置Scrollbars属性,使同步的拆分组只显示一个滚卷条,从而进一步自定义拆分的外观。
控制Tab键和箭头键的行为
使用WrapCellPointer、TabAcrossSplits、以及TabAction属性,可以决定当最终用户按下tab键或箭头键时网格的行为。
在这三个属性中,TabAction属性级别最高,它决定WrapCellPointer和TabAcrossSplits这两个属性是否能生效。TabAction有三个设置值:ControlNavigation、ColumnNavigation和GridNavigation。当该属性设置为ControlNavigation时,按tab键将根据TabIndex将焦点切换到下一个控件。这一设置优先于WrapCellPointer和TabAcrossSplits。
WrapCellPointer属性决定在任何单个的拆分中tab键和箭头键的行为。如果该属性设置为True,且当前单元位于最后一列,这时最终用户按tab键则使第一列的下一行变成当前的单元。不过,如果当前单元位于最后一行的最后一列时,这时就没有地方可以“换行”。
TabAcrossSplits属性决定当网格中存在两个或多个拆分时tab和箭头键的行为。如果该属性设置为True,且当前单元位于任何一个拆分的最后一列,则按tab或箭头键将使当前单元“跳”到下一个拆分的第一列。当前单元仍保持相同的行位置。
注意如果WrapCellPointer和TabAcrossSplits属性都设置为True,则只有当前单元位于最后一个拆分的最后一列时才会换行。这时当前单元将换到第一个拆分的第一列中的下一行。
自定义列集合
每一个Split对象都有一个Columns属性,允许用户来操作一个Column对象的集合。通过这样做,可以更改每个Split对象的外观。例如,可以用一个拆分包含显示姓氏字段和名字字段的两个列,而第二个拆分则显示电话字段和地址字段。要实现这一目标,需要将其它的每一列的Visible属性设置为False,如下所示:
'枚举Columns集合,对每一个Column对象的DataField属性
'进行测试。如果测试失败,则隐藏这一列。
DimiAsInteger
'隐藏除ProductName列之外的所有列。
Fori=0ToDataGrid1.Splits(0).Columns.Count-1
IfDataGrid1.Splits(0).Columns(i).DataField<>"ProductName"Then
DataGrid1.Splits(0).Columns(i).Visible=False
EndIf
Nexti
'隐藏除UnitPrice列之外的所有列。
Fori=0ToDataGrid1.Splits(0).Columns.Count-1
IfDataGrid1.Splits(1).Columns(i).DataField<>"UnitPrice"Then
DataGrid1.Splits(1).Columns(i).Visible=False
EndIf
NextI