前面曾发过一个日志,写的是listview加载上万条数据,那时还没理解RetrieveVirtualItem的用法,现在重新写一次,终于解决了打开别的窗体会出错的BUG. Imports EchoClass.EchoClassShow Imports GoldPrinter.DataGridViewListViewHelper Imports GoldPrinter.MisGoldPrinter Public Class MoneyReports Private myCache() As ListViewItem Private firstItem As Integer = 1 Private webmis As New GoldPrinter.MisGoldPrinter '打印组件 Private Sub goprint() webmis.Title = SoftWareName & "收入报表" '网格标题 webmis.Top = "制表人:" & sysuser & "|" & DateTimePicker1.Text & " 至 " & DateTimePicker2.Text & "|" & nowtime() webmis.DataSource = ToStringArray(ListView1, True) '任意二维的数据通通打印 CType(webmis.Body, GoldPrinter.Body).ColsWidth = New Int32() {80, 180, 60, 200, 90, 90, 90, 90, 80, 80, 138} End Sub Private Sub MoneyReports_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim u As New userlistshow(AddressOf userlist) u.Invoke() Dim mi As New fslistshow(AddressOf fslist) mi.Invoke() End Sub Private ds As New DataSet Private personnes As New List(Of Tpersonnes) Public Structure Tpersonnes Public ID As String Public sftime As String Public userid As String Public username As String Public sf As String Public fjf As String Public wsf As String Public znj As String Public wsznj As String Public ljf As String Public zjr As String Public sfy As String Public sffs As String Public fphm As String End Structure Delegate Sub userlistshow() Delegate Sub fslistshow() Private Sub listView1_RetrieveVirtualItem(ByVal sender As Object, ByVal e As RetrieveVirtualItemEventArgs) Handles ListView1.RetrieveVirtualItem Try Dim item As ListViewItem item = New ListViewItem(personnes(e.ItemIndex).ID.ToString()) item.SubItems.Add(personnes(e.ItemIndex).sftime) item.SubItems.Add(personnes(e.ItemIndex).userid) item.SubItems.Add(personnes(e.ItemIndex).username) item.SubItems.Add(personnes(e.ItemIndex).sf) item.SubItems.Add(personnes(e.ItemIndex).fjf) item.SubItems.Add(personnes(e.ItemIndex).wsf) item.SubItems.Add(personnes(e.ItemIndex).znj) item.SubItems.Add(personnes(e.ItemIndex).wsznj) item.SubItems.Add(personnes(e.ItemIndex).ljf) item.SubItems.Add(personnes(e.ItemIndex).zjr) item.SubItems.Add(personnes(e.ItemIndex).sfy) item.SubItems.Add(personnes(e.ItemIndex).sffs) item.SubItems.Add(personnes(e.ItemIndex).fphm) If e.ItemIndex Mod 2 = 0 Then item.BackColor = Color.AliceBlue Else item.BackColor = Color.White End If e.Item = item Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "系统提示") Return End Try End Sub Private Sub SimpleButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton1.Click If ListView1.Items.Count > 0 Then ListView1.Clear() End If ds.Reset() personnes.Clear() Dim up, down As String up = DateTimePicker1.Text down = DateTimePicker2.Text Dim downday, upday As String upday = Replace(Replace(Replace(up, "年", "-"), "月", "-"), "日", "") downday = Replace(Replace(Replace(down, "年", "-"), "月", "-"), "日", "") If DateDiff("d", upday, downday) < 0 Then MsgBox("上期时间不能小于本期时间!", MsgBoxStyle.Exclamation) Return End If Dim wait As New Wait wait.Label1.Text = "正在加载数据,请稍候..." wait.ProgressBar1.Visible = False wait.Show() wait.Refresh() Dim sql As String sql = "SELECT 水费收入表.id,水费收入表.收费时间, 水费收入表.用户编号, 水费收入表.用户名称, 水费收入表.水费, 水费收入表.附加费,水费收入表.污水费,isnull(水费收入表.垃圾费,0) as 垃圾费, 水费收入表.滞纳金, 水费收入表.总金额, 系统用户.用户名称 AS 收费人员, 水费收入表.收费方式, 水费收入表.发票号码,水费收入表.污水费滞纳金 FROM 水费收入表 INNER JOIN 系统用户 ON 水费收入表.收费员 = 系统用户.id WHERE (水费收入表.收费时间 > CONVERT(DATETIME, '" & upday & " 00:00:00', 102)) AND (水费收入表.收费时间 < CONVERT(DATETIME, '" & downday & " 23:59:59', 102))" Select Case ComboBox2.Text.Trim Case "全部" sql = sql Case Else sql += " AND 水费收入表.收费方式 = '" & ComboBox2.Text.Trim & "'" End Select Select Case ComboBox1.Text.Trim Case "全部" sql = sql Case Else Dim j As Object = ComboBox1.Text.Trim j = Split(j, "、") sql += " AND 水费收入表.收费员 = " & j(0) & "" End Select sql += " ORDER BY 水费收入表.收费时间 DESC" sqlread(sql, "收入报表") sql = "SELECT sum(水费) as 总水费金额,sum(附加费) as 总附加费,sum(滞纳金) as 总滞纳金,sum(污水费) as 总污水费,sum(总金额) as 总总金额,sum(污水费滞纳金) as 总污水滞, isnull(sum(垃圾费),0) as 垃圾费 FROM 水费收入表 WHERE (收费时间 > CONVERT(DATETIME, '" & upday & " 00:00:00', 102)) AND (收费时间 < CONVERT(DATETIME, '" & downday & " 23:59:59', 102))" Select Case ComboBox2.Text.Trim Case "全部" sql = sql Case Else sql += " AND 收费方式 = '" & ComboBox2.Text.Trim & "'" End Select Select Case ComboBox1.Text.Trim Case "全部" sql = sql Case Else Dim j As Object = ComboBox1.Text.Trim j = Split(j, "、") sql += " AND 收费员 = " & j(0) & "" End Select sqlread(sql, "补") ds = EchoDS Dim dr As DataRow = ds.Tables("收入报表").NewRow() dr("用户名称") = "合计:" dr("水费") = ds.Tables("补").Rows(0).Item("总水费金额") dr("附加费") = ds.Tables("补").Rows(0).Item("总附加费") dr("污水费") = ds.Tables("补").Rows(0).Item("总污水费") dr("污水费滞纳金") = ds.Tables("补").Rows(0).Item("总污水滞") dr("滞纳金") = ds.Tables("补").Rows(0).Item("总滞纳金") dr("总金额") = ds.Tables("补").Rows(0).Item("总总金额") dr("垃圾费") = ds.Tables("补").Rows(0).Item("垃圾费") ds.Tables("收入报表").Rows.Add(dr) ds.Tables("补").Reset() If ds.Tables("收入报表").Rows.Count <= 0 Then wait.Dispose() ListView1.VirtualMode = False MsgBox("暂无当前时间段的收入报表!", MsgBoxStyle.Information) Return Else For i As Integer = 0 To ds.Tables("收入报表").Rows.Count - 1 Dim _Ps As New Tpersonnes() _Ps.ID = ds.Tables("收入报表").Rows(i).Item("id").ToString _Ps.sftime = ds.Tables("收入报表").Rows(i).Item("收费时间").ToString _Ps.userid = ds.Tables("收入报表").Rows(i).Item("用户编号").ToString _Ps.username = ds.Tables("收入报表").Rows(i).Item("用户名称").ToString _Ps.sf = ds.Tables("收入报表").Rows(i).Item("水费").ToString _Ps.fjf = ds.Tables("收入报表").Rows(i).Item("附加费").ToString _Ps.wsf = ds.Tables("收入报表").Rows(i).Item("污水费").ToString _Ps.znj = ds.Tables("收入报表").Rows(i).Item("滞纳金").ToString _Ps.wsznj = ds.Tables("收入报表").Rows(i).Item("污水费滞纳金").ToString _Ps.ljf = ds.Tables("收入报表").Rows(i).Item("垃圾费").ToString _Ps.zjr = ds.Tables("收入报表").Rows(i).Item("总金额").ToString _Ps.sfy = ds.Tables("收入报表").Rows(i).Item("收费人员").ToString _Ps.sffs = ds.Tables("收入报表").Rows(i).Item("收费方式").ToString _Ps.fphm = ds.Tables("收入报表").Rows(i).Item("发票号码").ToString personnes.Add(_Ps) Next ListView1.BeginUpdate() ListView1.VirtualMode = True ListView1.VirtualListSize = personnes.Count AddHandler ListView1.RetrieveVirtualItem, AddressOf listView1_RetrieveVirtualItem ListView1.EndUpdate() ListView1.Columns.Add("流水号") ListView1.Columns.Add("交费时间") ListView1.Columns.Add("用户编号") ListView1.Columns.Add("用户名称") ListView1.Columns.Add("水费金额") ListView1.Columns.Add("附加费") ListView1.Columns.Add("污水费") ListView1.Columns.Add("水费滞纳金") ListView1.Columns.Add("污水滞纳金") ListView1.Columns.Add("垃圾费") ListView1.Columns.Add("总金额") ListView1.Columns.Add("收费员") ListView1.Columns.Add("交费方式") ListView1.Columns.Add("发票号码") ListView1.Columns.Item(0).Width = 60 ListView1.Columns.Item(1).Width = 150 ListView1.Columns.Item(2).Width = 80 ListView1.Columns.Item(3).Width = 150 ListView1.Columns.Item(4).Width = 80 ListView1.Columns.Item(5).Width = 80 ListView1.Columns.Item(6).Width = 80 ListView1.Columns.Item(7).Width = 80 ListView1.Columns.Item(8).Width = 80 ListView1.Columns.Item(9).Width = 80 ListView1.Columns.Item(10).Width = 80 ListView1.Columns.Item(11).Width = 80 ListView1.Columns.Item(12).Width = 80 ListView1.Columns.Item(13).Width = 150 End If wait.Dispose() End Sub Private Sub SimpleButton4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton4.Click Me.Dispose() End Sub Private Sub userlist() If ComboBox1.Items.Count > 0 Then ComboBox1.Items.Clear() End If ComboBox1.Items.Add("全部") sqlread("select * from 系统用户 where 称号 = '营业员' order by id asc", "营") For i As Integer = 0 To EchoDS.Tables("营").Rows.Count - 1 ComboBox1.Items.Add(EchoDS.Tables("营").Rows(i).Item("id") & "、" & EchoDS.Tables("营").Rows(i).Item("用户名称")) Next EchoDS.Tables("营").Reset() ComboBox1.Text = "全部" End Sub Private Sub fslist() If ComboBox2.Items.Count > 0 Then ComboBox2.Items.Clear() End If ComboBox2.Items.Add("全部") sqlread("select * from 收费方式 order by id asc", "方") For i As Integer = 0 To EchoDS.Tables("方").Rows.Count - 1 ComboBox2.Items.Add(EchoDS.Tables("方").Rows(i).Item("收费方式")) Next EchoDS.Tables("方").Reset() ComboBox2.Text = "全部" End Sub Private Sub SimpleButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton2.Click goprint() webmis.Preview() webmis.Dispose() End Sub Private Sub SimpleButton5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton5.Click webmis.PageSetup() webmis.Dispose() End Sub Private Sub SimpleButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton3.Click goprint() webmis.Print() webmis.Dispose() End Sub End Class