关于MSHFlexGrid控件复用问题

jsjjms 2010-10-19 04:47:47
最近在开发一个报税软件,里面用到了MSHFLexGrid控件。

过程是这样的,第一次从数据库里取得数据然后使用 AddItem方法 一项一项插入表格里。一点问题都没有。

数据显示完毕会进行一系列的选择后,然后将MSHFlexGrid控件复用,刷新后只显示选择后的数据。但奇怪的是

刷新后控件里面只显示TextMatrix设定的表格头,对于新AddItem加载的数据都无法显示。复用的时候的代码是:



Dim i As Integer
For i = 1 To iRowsNo - 1 'iRowsNo 是全局变量,表示当前有多少列数据需要显示
DataTable.RemoveItem 1 '这里的目的将原来显示的数据清空掉
Next i
InitFields '使用TextMatrix设置显示表格头
ShowData GetDataFromCart 'showData 是显示数据的函数 GetDataFromCart取数据库得到数据



'这里将ShowData的实现也贴出来了。
Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer
i = 0
Do While (Jobs(i).Job <> "NULL")

row = "" & vbTab & iRowsNo & vbTab & Jobs(i).Job & vbTab & Jobs(i).JobDate & vbTab & Jobs(i).Price & vbTab & Jobs(i).GST
DataTable.AddItem row, iRowsNo
iRowsNo = iRowsNo + 1
i = i + 1
Loop
End Function


因为对这个控件很不熟悉,所以实在查不出来到底出什么问题了。
请大家帮帮忙,谢谢了。

...全文
106 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
经过我不断代码实验,终于发现了原因。



Dim i As Integer
For i = 1 To iRowsNo - 1 'iRowsNo 是全局变量,表示当前有多少列数据需要显示
DataTable.RemoveItem 1 '这里的目的将原来显示的数据清空掉
Next i
InitFields '使用TextMatrix设置显示表格头
ShowData GetDataFromCart 'showData 是显示数据的函数 GetDataFromCart取数据库得到数据


这段代码中, 我发现代码执行的顺序是:

InitFields '使用TextMatrix设置显示表格头
ShowData GetDataFromCart 'showData 是显示数据的函数 GetDataFromCart取数据库得到数据


然后再执行 前面的删除代码。

我刚只是把删除的代码暂时注释掉,发现我需要的数据都能显示出来。

对VB的编译和执行原理不是很懂,哪位懂的能否讲讲?谢谢了。
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
谢谢您这么耐心:)

这里我已经试过了。row里面的数据都是正确的,但是经过AddItem的时候界面并没有任何变化,使用 TextMatrix(iRowsNo, 2)也得不到任何数据。


[Quote=引用 15 楼 lxq19851204 的回复:]

VB code
Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer
i = 0
iRowsNo=0 '把iRowsNo的值清0
Do While (Jobs(i).Job <> "NULL")
row = "" & vbTab & ……
[/Quote]
jsjjms 2010-10-19
  • 打赏
  • 举报
回复

Private Function GetDataFromCart() As JobInvTemp()
Dim Jobs(1000) As JobInvTemp

Dim Rs As New ADODB.Recordset
Dim Conn As New ADODB.Connection

Conn.Open strConn
If Rs.State <> adStateClosed Then Rs.Close

Dim strSQL As String
strSQL = "select * from InvTemp where IsInCart=True"
Rs.Open strSQL, Conn, adOpenStatic, adLockOptimistic

Dim i As Integer
i = 0
Do While Not Rs.EOF
With Jobs(i)
.Job = Rs.Fields("Job")
.JobDate = Rs.Fields("JobDate")
.Price = Rs.Fields("Price")
.GST = Rs.Fields("GST")
.IsTicked = Rs.Fields("IsTicked")
.IsInCart = Rs.Fields("IsInCart")
End With
i = i + 1
Rs.MoveNext
Loop

Jobs(i).Job = "NULL"

Rs.Close
Conn.Close

GetDataFromCart = Jobs
End Function



这里的代码我都跟踪过, 最后出来的数据是没有问题的。

[Quote=引用 14 楼 lxq19851204 的回复:]

VB code
ShowData GetDataFromCart 'showData 是显示数据的函数 GetDataFromCart取数据库得到数据 '我估计问题就出在这里 GetDataFromCart代码贴出来

'这里将ShowData的实现也贴出来了。
Private Function ShowData(Jobs() As JobInvTemp)
Dim row As ……
[/Quote]
lxq19851204 2010-10-19
  • 打赏
  • 举报
回复
Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer
i = 0
iRowsNo=0 '把iRowsNo的值清0
Do While (Jobs(i).Job <> "NULL")
row = "" & vbTab & iRowsNo+ 1 & vbTab & Jobs(i).Job & vbTab & Jobs(i).JobDate & vbTab & Jobs(i).Price & vbTab & Jobs(i).GST
DataTable.AddItem row, iRowsNo ‘设断点,一步一步运行看看
iRowsNo = iRowsNo + 1
i = i + 1
Loop
End Function

这个试一下
lxq19851204 2010-10-19
  • 打赏
  • 举报
回复
ShowData GetDataFromCart 'showData 是显示数据的函数 GetDataFromCart取数据库得到数据      '我估计问题就出在这里 GetDataFromCart代码贴出来

'这里将ShowData的实现也贴出来了。
Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer
i = 0
Do While (Jobs(i).Job <> "NULL")

row = "" & vbTab & iRowsNo & vbTab & Jobs(i).Job & vbTab & Jobs(i).JobDate & vbTab & Jobs(i).Price & vbTab & Jobs(i).GST
DataTable.AddItem row, iRowsNo
iRowsNo = iRowsNo + 1
i = i + 1
Loop
End Function
还有iRowsNo是全局变量,iRowsNo的值是会慢慢加上去的,要是之前iRowsNo=8的话,DataTable.AddItem row, iRowsNo=8
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
Clear的方法我也加上去了。不过没有作用,
因为clear是将表格里的数据清空,实际表格还在。
所以我clear后,还得继续循环使用RemoveItem



[Quote=引用 10 楼 kill2010 的回复:]

MSHFlexGrid.Clear

引用 9 楼 jsjjms 的回复:
Re: lxq19851204

我刚试了下 removeitem从index=0开始,最后报错:

实时错误 '30015'
Cannot remove last non-fixed row
[/Quote]
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lxq19851204 的回复:]

VB code
Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer
i = 0
Do While (Jobs(i).Job <> "NULL")

row = "" & vbTab & iRowsNo & vbTab & ……
[/Quote]

iRowsNo 是我定义的一个全局变量,需要手动进行 +1操作。
谢谢
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 vbman2003 的回复:]

VB code

Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer

i = 0
Do While (Jobs(i).Job <> "NULL")
row = "" & vbTab & iRowsNo & vbTab &……
[/Quote]

DataTable.rows是一个系统自动递增的变量,如果手动变化,结果会很恐怖的。请看4楼,我在结束的时候做过测试。 DataTable.rows里面的数据都是正确的。
只是到最后没有显示。

谢谢
Kill2010 2010-10-19
  • 打赏
  • 举报
回复
MSHFlexGrid.Clear

[Quote=引用 9 楼 jsjjms 的回复:]
Re: lxq19851204

我刚试了下 removeitem从index=0开始,最后报错:

实时错误 '30015'
Cannot remove last non-fixed row
[/Quote]
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
Re: lxq19851204

我刚试了下 removeitem从index=0开始,最后报错:

实时错误 '30015'
Cannot remove last non-fixed row
lxq19851204 2010-10-19
  • 打赏
  • 举报
回复
Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer
i = 0
Do While (Jobs(i).Job <> "NULL")

row = "" & vbTab & iRowsNo & vbTab & Jobs(i).Job & vbTab & Jobs(i).JobDate & vbTab & Jobs(i).Price & vbTab & Jobs(i).GST
DataTable.AddItem row, i
i = i + 1
if i > iRowsNo then exit function
Loop
End Function
vbman2003 2010-10-19
  • 打赏
  • 举报
回复

Private Function ShowData(Jobs() As JobInvTemp)
Dim row As String
Dim i As Integer

i = 0
Do While (Jobs(i).Job <> "NULL")
row = "" & vbTab & iRowsNo & vbTab & Jobs(i).Job & vbTab & Jobs(i).JobDate & vbTab & Jobs(i).Price & vbTab & Jobs(i).GST
DataTable.rows=DataTable.rows+1 '<-----这个要加吧
DataTable.AddItem row, iRowsNo
iRowsNo = iRowsNo + 1
i = i + 1
Loop
End Function


lxq19851204 2010-10-19
  • 打赏
  • 举报
回复
For i = 0 To iRowsNo - 1  'iRowsNo 是全局变量,表示当前有多少列数据需要显示
DataTable.RemoveItem i '这里的目的将原来显示的数据清空掉
Next i

REMOVEITEM从index=0开始.
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
RE:king06

试过了,没有显示
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
在showData的函数结束,我还加入了测试语句:

msgbox DataTable.Rows

打印出来的是6,除去第一行是通过TextMatrix赋值上去的, 剩余5项是通过取数据库得到的,而且跟踪下来都是正确的,只是在界面上没有显示
king06 2010-10-19
  • 打赏
  • 举报
回复
每执行一次DataTable.AddItem row, iRowsNo
debug一下DataTable.textmatrix(iRowsNo,1),或者切换到界面上也可以看到
jsjjms 2010-10-19
  • 打赏
  • 举报
回复
是的,我刚又重新单步跟踪了下。肯定有数据。而且ShowData 里面的循环都走到了。
Kill2010 2010-10-19
  • 打赏
  • 举报
回复
你确定GetDataFromCart取数据库得到数据了吗?

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧