轻松实现拖动行动能

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

ListView中的行是拖动的,行可以在ListView内部拖动,以可视化的方式调整行的位置,也可以将行从一个ListView拖动到另一个ListView,只要两个ListView的结构相同。

ListView有两个和拖动相关的属性,分别是:

你如果要实现普通的拖动行功能,只需将这两个属性设置为True即可,是的,就是这么简单。

下面我们来做个练习,任务是实现下图所示的功能,ListView中行可以通过拖动调整位置,且可以将调整后的顺序保存在DataTable中:

设计步骤:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
lvw
.StopRedraw() '暂停绘制
lvw
.View = ViewMode.Details '显示模式为详细信息
lvw
.GridLines = True '显示网格线
lvw
.AllowDrag = True '允许拖动行
lvw.AllowDrop = True '允许 接收拖动过来的行
Dim
cls() As String = {"国家","人口","面积","语言","宗教",""} '指定要显示的各列
Dim wds() As Integer = {100,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 '面积列靠右对齐
For
Each dr As DataRow In DataTables("国家").Select("", "_SortKey") '从数据表中提取数据
   
Dim Key As String = dr("图标")
   
Dim r As  WinForm.ListViewRow =  lvw.Rows.Add() '增加一行
    lvw.Images.AddImage(Key, Key &
".ico", Key & "48.ico") '添加代表这个国家的一对图标
    r.ImageKey = Key
'指定图标键值
    r.tag = dr
'DataRow保存在行的
   
For Each cl As String In cls '逐列取值
       
Select Case cl
           
Case "人口","面积" '如果是人口列或面积列
                r(cl) = format(dr(cl),
"#,000") '则显示千位分割符号
           
Case Else
                r(cl) = dr(cl)
       
End Select
   
Next
Next

lvw
.ResumeRedraw() '恢复绘制

上面的代码中,和拖动相关的代码就是第5和第6行,另外注意第18行的,为了体现出“顺序”,我们根据_SortKey列的值的顺序来添加ListViewRow,并在第23行代码将对应的DataRow赋值给ListViewRow的Tag属性,方便之后调用。

2、将“保存顺序”按钮的代码设置为:

Dim lvw As WinForm.ListView = e.Form.Controls("ListView1")
DataTables
("国家").StopRedraw
For
Each vr As WinForm.ListViewRow In lvw.Rows
    Dim dr As DataRow = vr.tag
    dr.BaseRow("_SortKey") = vr.
Index

Next
DataTables
("国家").ResumeRedraw
DataTables
("国家").Save()

提示:

1、这个例子用_SortKey列作为顺序列,你也可以用其它列,只要这一列的值能代表行的顺序即可。
2、对于外部表,_SortKey列默认是没有的,需要启用插入行功能,才会增加这一列。
3、如果你足够细心,你也许已经发现我们是这样更新_SortKey这一列的值的:

dr.BaseRow("_SortKey") = vr.Index

这是因为_SortKey是系统列,不能直接更改它的值,必须通过BaseRow才能更改。


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