在线等:mshflexgrid控件绑定记录集,实时刷新数据,表格无法下拉问题。

euan 2005-03-25 04:10:50
dim adoRecordset As Recordset
dim db As Connection
dim CN As New ADODB.Connection
dim rs1 As ADODB.Recordset
Private Sub Form_Load()
CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=d:\db.mdb"
CN.Open
Set rs1 = New Recordset
rs1.Open "select * from device1", CN, adOpenDynamic, adLockOptimistic
Set Grid1.DataSource = rs1
Grid1.ColWidth(0) = 800
Grid1.ColWidth(1) = 2000
Grid1.ColWidth(2) = 2500
Grid1.ColWidth(3) = 2000
End Sub
Private Sub UpdateTagSubset()
Dim i As Integer
Dim j As Integer

If Not rs1.EOF Then
rs1.MoveFirst
For i = 1 To m_appDeviceCount
For j = 1 To m_nvCount
rs1!value = m_deviceArray(i, j ).value
rs1.Update

Set Grid.DataSource=Nothing
Set Grid.DataSource=rs1

Grid1.Refresh
rs1.MoveNext
Next
Next
End If
Exit Sub
End Sub

还有
UpdateTagSubset()这个过程我用的是定时器来不断的更新数值的,请大侠帮忙啊!!!
Private Sub timeNV_Timer()
UpdateTagSubset
Exit Sub
End Sub


真的非常感谢各位给我的帮助,Gutta(冯大狂),vbman2003(家人),leayh(云卷云舒)
表格数据可以刷新了,但是我同时又发现了新的问题,我需要实时更新的有56个监控点,因为数据比较多所以表格右面有下拉条,这时候我发现在表格上刷新的同时,是无法下拉的,是不是因为我定时器设的时间间隔比较小啊,我设的interval是500的,那么这个是不是VB自身带来的问题,因为它不支持多线程,我现在不知道有什么措施可以改进,请大家帮我出出主意,
...全文
309 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
euan 2005-03-26
  • 打赏
  • 举报
回复
用按扭手动刷新肯定不行的,会被老板骂死的,能不能把采集数据并存储到数据库这一块做成dll,或exe控件,然后再调用他啊,我没有做过,请高手给我意见啊,分我可以给很多,关键能解决问题啊!
Gutta 2005-03-26
  • 打赏
  • 举报
回复
不可能吧~

我试过了的,不会影响滚动条的。

晕哦~~
wuchao1983 2005-03-26
  • 打赏
  • 举报
回复
建议不要使用记时器,500ms刷一次太耗资源了,使用xiaoxiaoP的方法,用一个按钮手动刷新
yingxiangchen 2005-03-26
  • 打赏
  • 举报
回复
Doevents心须在你UpDate的过程当中才行的
yingxiangchen 2005-03-26
  • 打赏
  • 举报
回复
建议你在定时器的Timer事件中加入一句Doevents可能就能解决吧的问题,有没有解,告诉我一声喽。
xiaoxiaoP 2005-03-26
  • 打赏
  • 举报
回复
Sorry,还有一点,表格用定时器刷新的话,时间间隔断了的话下拉条肯定不好使,最好加一个按钮,但需要察看时,先将定时器暂停,察看完了再打开,表格中的数据可以使用倒排,新的数据放到最上面。
xiaoxiaoP 2005-03-26
  • 打赏
  • 举报
回复
要是监控点定时监控的有效间隔可以加长的话,即是降低了数据采集的频度,时间间隔足够长的当然没问题了,并受系统的性能制约。最好使用多线程来采集数据,还可以将数据采集和数据显示分做两个独立的程序,也可以。
euan 2005-03-26
  • 打赏
  • 举报
回复
我先前就没用绑定,可是感觉程序就一直在执行定时器中的数据更新,我无法点其他按钮了,绑定也是用来尝试一下的,我发现效果都不好啊
Gutta 2005-03-26
  • 打赏
  • 举报
回复
给我个绑定的理由先~
wumylove1234 2005-03-26
  • 打赏
  • 举报
回复
不用绑定肯定行了.
euan 2005-03-25
  • 打赏
  • 举报
回复
哎,你没有明白我的意思,我用了你的方法,还是不行,我需要从现场56个监控点采集数据,实时存放到数据库并不断更新,这需要定时器,然后我还要以表格形式全部显示出更新的数据,由于是单线程,我的程序一直在定时器里面设定的程序中循环,这导致了我下拉滚动条都没法动,除非我把定时间隔设的长点,但是在进入循环的这点时间里面还是没法点击其他按钮的,我的困惑就在这,是不是只有多线程才能解决这个问题啊???
Gutta 2005-03-25
  • 打赏
  • 举报
回复
Private Sub Timer1_Timer()
Call Command1_Click
End Sub

这样问题是不是基本上解决了呢?

对了,一般说来,对于网格的标题栏是一般都有的,在Form_Load中可以先定义一下每个标题
字段总不会增加吧?当然你也可以在Command1_Click()中来进行设置标题,当然最好你的数据库中的字段是中文字段,这样填充起来就很简单了,直接用Rs.Fields(n).Name来做标题。

还有一个建议,如果说记录比较多的话,这样频繁得进行读取和填充势必会降低效率,一般的做法为,在数据库中,加一个字段,来表示修改,如果一修改,那么就为True,这样你在Select * from Table时可以加一个Where Modified=True的判断,然后只需要填充修改过的记录就好了,简单得说,就是只要循环判断Table.ID一圈就可以了,因为符合条件的记录是依次取出来的,而你先前填充的记录也是依次填充的,如果在第10行是是Table.ID的那个要重新填充记录的话,那么下一个Select出来的Table.ID肯定在10行以后了。

这样就不用很麻烦得全部填充每个字段了,对多字段和多记录时,只需要一个判断,比填充快多了。

个人建议,Just a reference!
Gutta 2005-03-25
  • 打赏
  • 举报
回复
这个问题不是很好解决吗?

你每个定时器提取出数据以后,然后用我刚刚告诉你的方法来填充到网格中,就算是有滚动条也是不会弹回去的,部分代码如下:

Private Sub Command1_Click()
Set Rs = New ADODB.RecordSet
Rs.Open "Select * from device1", CN //这里用默认的只读向前方式,比较快
//上面是Rs提取数据,老实说,我根本不同意用MsFlexGrid来绑定,因为你需要定时器来绑定,读取,再棒定,再读取,这样还不如不绑定,读取归读取,填充归填充。
With MSFlexGrid1
.Cols=Rs.Fields.Count //列数
.Rows=Rs.RecordCount //行数
.Redraw=False
//假设没有列标题和行标题,第一个单元格是(0,0),如果有列标题和行标题要+1,后面循环的地方要改变一下TextMatrix(i,j)为TextMatrix(i+1,j+1)
for i=0 to Rs.RecordCount-1
for j=0 to Rs.Fields.Count-1
.TextMatrix(i,j)= Rs.Fields(j).Value
//这里可以用循环把记录集的数据一个个一行行地到每个单元格中去
Next //据说不写Next变量能提高运行速度...嘿嘿
Next
.Redraw=True
End With
ENd Sub

这样一来,滚动条是不会动的,嘿嘿,试一下~~

以上代码请放心使用,不懂再问好了。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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