虚拟模式与数据表的互动

为了便于学习本节的内容,可以先打开CaseStudy目录下的文件“ListView.Table”,并参考该文件名为“示例十 八”的窗口。

由于虚拟模式可以瞬间显示大量数据,所以实际使用ListView的时候,使用虚拟模式的几率非常大。
FoxTable针对虚拟模式进行了大量的优化,与数据表的互动就是其中之一,你会看到,和常规模式相比,虚拟模式下和数据表的互动反倒变得简单了。

本节的任务是设计下图所示的系统,要求:

1、ListView用虚拟模式生成
2、在ListView中双击某国家,能宽带一个编辑窗口来修改此国家的信息。
2、单击增加、删除按钮,可以增加、删除国家。

设计步骤:

1、新建一个窗口,插入一个ListView控件和三个按钮

2、窗口的AfterLoad事件代码设置为:

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
lvw
.StopRedraw() '暂停绘制
lvw
.View = ViewMode.Details  '显示模式为详细内容
lvw
.GridLines = True '显示网格线
lvw
.MultiSelect = False  '禁止选择多行
Dim
cls() As String = {"国家","人口","面积","语言","宗教",""} '指定要显示的各列 
Dim
wds() As Integer = {120,100,130,80,80,80} '定义列宽
For
i As Integer = 0 To  cls.Length - 1
   
Dim c As WinForm.ListViewColumn = lvw.Columns.Add()
   
c.Name = cls(i) '指定列名
   
c.Text = cls(i)'指定列标题  
   
c.Width = wds(i) '指定列宽
Next

lvw
.Columns("人口").Text = "人口()" '修改人口列的标题
lvw
.Columns("人口").TextAlign = HorizontalAlignment.Right '人口列靠右对齐
lvw
.Columns("面积").TextAlign = HorizontalAlignment.Right '面积列靠右对齐
lvw
.VirtualMode = True  '以虚拟模式显示
lvw
.VirtualListSize = DataTables("国家").DataRows.count '设置虚拟模式下要显示的行数
lvw
.ResumeRedraw() '恢复绘制

3、将ListView的RetrieveVirtualRow事件代码设置为:

Dim lvw As WinForm.ListView = e.Sender
Dim
dr As DataRow = DataTables("国家").DataRows(e.Index) '根据行位置从数据表中取得对应的DataRow
Dim
Key As String = dr("图标")
lvw
.Images.AddImage(Key, Key & ".ico", Key & "48.ico") '添加代表这个国家的图标
e
.Row.Imagekey = key '指定图标键值
e
.Row.Tag = dr '将DataRow赋值给ListViewRow的Tag属性,将二者联系起来
For
Each cl As WinForm.ListViewColumn In lvw.Columns '逐列取值
    Select Case cl.Name
        Case "人口","面积" '如果是人口列或面积列
            e.Row(cl.Name) = Format(dr(cl.Name),"#,000") '则显示千位分割符号
        Case Else
            e.Row(cl.Name) = dr(cl.Name)
    End Select

Next

4、将ListView的RowActivate事件代码设置为:

Dim btn As WinForm.Button = e.Form.Controls("btnModify")
btn
.PerformClick() '模拟单击修改按钮

5、三个按钮的代码分别设置为:

按钮 代码
增加

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
Dim
r As Row = Tables("国家").AddNew()
Dim
cnt As Integer = DataTables("国家").DataRows.Count '记录打开窗口前的行数
Forms
("国家信息").Open()
If
DataTables("国家").DataRows.Count = cnt '如果新增行已经保存
    lvw.VirtualListSize = lvw.VirtualListSize + 1 '
通知ListView,系统增加了一行
End
If

删除

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
Dim
vr As WinForm.ListViewRow = lvw.Current '获取ListView中选定的行
If
vr Is Nothing Then '如果不存在当前行,也就是内有选定任何一行
    Return

End
If
Dim
dr As DataRow = vr.tag '获取此行对应的DataRow
dr
.Delete 'DataTable删除行
vr
.Delete '从ListView删除行

修改

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
Dim
vr As WinForm.ListViewRow = lvw.Current '获取ListView的当前行
If
vr Is Nothing Then '如果不存在当前行,也就是内有选定任何一行
    Return

End
If
Dim
dr As DataRow = vr.tag '获取此行对应的DataRow
Dim
ps As Integer = Tables("国家").FindRow(dr)
If
ps >= 0 Then
    Tables("国家").Position = ps
    Forms("国家信息").Open()
    vr.Retrieve() '通知ListView,重新生成此行

End
If

可以看出,在虚拟模式下,增加和修改按钮的代码变得简单了,只需简单地通知ListView,已经增加了一行或某一行需要重新生成,当你需要对ListView的显示做更多复杂设置时,你会觉得这种特性尤为可贵。


本页地址:http://www.foxtable.com/webhelp/topics/2823.htm