ListView和数据表的互动

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

ListView本身的数据编辑功能很弱,只能编辑标题(显示多列内容时,第一列作为标题)。
多数时候,我们用ListView只是展示数据,而数据编辑和管理需要通过DataTable和Table来实现。


本节的任务:

1、在ListView中双击某员工,能打开一个编辑窗口来修改此员工的信息。
2、单击增加、删除按钮,可以增加、删除员工。

设计步骤:

1、新建一个窗口,插入一个ListView控件和三个按钮
2、窗口的AfterLoad事件代码设置为:

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
lvw
.View = ViewMode.Details
lvw
.Images.AddSmallImage("Man", "Man.ico") '添加代表男性的图标
lvw
.Images.AddSmallImage("Woman", "Woman.ico") '添加代表女性的图标
Dim
cls() As String = {"编号","姓名","部门","职务","性别","地址"} '定义列名
Dim
wds() As String = {60,60,60,100,60,140} '定义列宽
For
i As Integer = 0 To  cls.Length - 1  '增加列
   
Dim c As WinForm.ListViewColumn = lvw.Columns.Add()
   
c.Text = cls(i) '指定列标题
   
c.Name = cls(i) '指定列名 
   
c.Width = wds(i) '指定列宽
Next

For
Each dr As DataRow In DataTables("员工").DataRows '从数据表中提取数据
    Dim
vr As  WinForm.ListViewRow lvw.Rows.Add() '增加一行
    For Each
cl As String In cls '逐列取值
       
vr(cl) = dr(cl)
    Next
    If
dr("性别") = "" Then '设置分组
       
vr.ImageKey = "Man"
    Else
       
vr.ImageKey = "Woman"
   
End If
   
vr.Tag= dr '将DataRow赋值给ListViewRow的Tag属性,将二者联系起来
Next

上述代码中最关键的一行是:

vr.Tag= dr '将DataRow赋值给ListViewRow的Tag属性,将二者联系起来

我们将ListViewRow对应的DataRow保存在Tag属性中,这样即可在其它事件中,通过ListViewRow的Tag属性获取对应的DataRow。
Tag属性可以存储任何类型的数据,当然多数时候存储的是DataRow、Row或对应的主键值。

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

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

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

按钮 代码
增加

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 '如果新增行已经保存
    Dim vr As WinForm.ListViewRow = lvw.Rows.Add()
    For Each cl As WinForm.ListViewColumn In lvw.Columns
'
逐列取值
        vr(cl.Name) = r(cl.Name)
    Next
    If r(
"
性别") = "" Then '设置分组
        vr.ImageKey = "Man"
    Else
        vr.ImageKey = "Woman"
    End If
    vr.Tag = r.DataRow
'
DataRow赋值给ListViewRowTag属性,将二者联系起来
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
    For Each
cl As WinForm.ListViewColumn In lvw.Columns '逐列更新值
       
vr(cl.Name) = r(cl.Name)
   
Next
End If


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