如何实现两个mshflexgrid表格水平滚动时能够联动呀?
有两个表格,一上一下,上面是明细表,下面是合计表,只放一行合计数据,我想实现当明细表水平滚动时,合计行表格也可以同步滚动,不知如何实现才好,谢谢了。
有两个表格,一上一下,上面是明细表,下面是合计表,只放一行合计数据,我想实现当明细表水平滚动时,合计行表格也可以同步滚动,不知如何实现才好,谢谢了。
解决方案 »
- 自从装了vs2008和vs2010,vb6打开就非常慢了.有解决办法没?搜了下都没说办法的.谢谢!
- fpSpread 用DEL键清除选择单元格内容?
- vb如何实现复杂动态查询?
- 垃圾问题请教:用控件如何循环播放
- 纯代码模块中能否使用CommonDialog? 如果不能,使用API函数来选取文件怎么实现?
- 我想在ASP中上传图片到数据库!
- 有问题but easy
- 要找东西的人是我 (非礼勿扰,谢谢合作!!)
- ###动物(animal)的咬(bite)有狗(dog)咬和猫(cat)咬,能不能用VB实现该多态的例子?###
- 在我制作的安装程序中总是要出现 注册文件 d:\winnt\system32\msado25.tlb时出错,只有手动在系统中装ado才能正确使用,不知哪位大虾能解
- 请问如何使用MD5加密“中英文混合字符串”?
- 求printer对象打印的列子
模块:
Option Explicit'以下程式在module1.bas
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEMOVE = &H200
Public Const WM_RBUTTONDOWN = &H204
Private Const WM_HSCROLL = &H114
Public preWinProc As LongPublic Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HSCROLL Then
'这里注意一定要写全:窗体名.要联动的MSHFlexGrid控件名.hwnd
SendMessage Form1.MSHFlexGrid2.hwnd, WM_HSCROLL, wParam, ByVal lParam
End If
'將之送往原來的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function'窗体,两个MSHFlexGrid控件(MSHFlexGrid1和MSHFlexGrid2)
Option ExplicitPrivate Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(MSHFlexGrid1.hwnd, GWL_WNDPROC)
ret = SetWindowLong(MSHFlexGrid1.hwnd, GWL_WNDPROC, AddressOf wndproc)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(MSHFlexGrid1.hwnd, GWL_WNDPROC, preWinProc)
End Sub
'Form1上放 MSFlexGrid1 、MSFlexGrid2、 Timer1
'复制下列代码,即可验证
'--------------------------------------------
'声明全局变量
Dim blMove As Boolean '列宽改变标志
Dim iColWidth() As Integer '存放MSFlexGrid1列宽数组Private Sub Form_Load()
blMove = False '开始时当然没移动了
MSFlexGrid1.Cols = 15
MSFlexGrid1.Rows = 100
MSFlexGrid2.Cols = 15
MSFlexGrid2.Rows = 100
MSFlexGrid1.ScrollTrack = True '数据同时滚动
MSFlexGrid2.ScrollTrack = True
ReDim iColWidth(MSFlexGrid1.Cols) '根据实际列宽重新定义记录数组的大小
ReDim bColVisible(MSFlexGrid1.Cols) '根据实际列宽重新定义数组的大小
For i = 0 To MSFlexGrid1.Cols - 1
iColWidth(i) = MSFlexGrid1.ColWidth(i)
Next
For i = 0 To MSFlexGrid1.Rows - 1
For j = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid1.TextMatrix(i, j) = i & "," & j
MSFlexGrid2.TextMatrix(i, j) = i & "," & j
Next j
Next i
Timer1.Enabled = True
Timer1.Interval = 100
End SubPrivate Sub MSFlexGrid1_Scroll()
MSFlexGrid1.Row = MSFlexGrid1.TopRow
MSFlexGrid1.Col = MSFlexGrid1.LeftCol
MSFlexGrid2.TopRow = MSFlexGrid1.TopRow
MSFlexGrid2.LeftCol = MSFlexGrid1.LeftCol
End SubPrivate Sub Timer1_Timer()
Call CheckWidth '检查是否列宽改变了
If blMove Then '如果改变了
For i = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid2.ColWidth(i) = MSFlexGrid1.ColWidth(i)
Next
End If
'重新记录列宽
For i = 0 To MSFlexGrid1.Cols - 1
iColWidth(i) = MSFlexGrid1.ColWidth(i)
Next
blMove = False
End Sub Sub CheckWidth() '检查是否列宽改变了
For i = 0 To MSFlexGrid1.Cols - 1
If MSFlexGrid1.ColWidth(i) <> iColWidth(i) Then
blMove = True
Exit For
End If
Next
End Sub
Private Sub MSHFlexGrid1_Scroll()
MSHFlexGrid1.Row = MSHFlexGrid1.TopRow
MSHFlexGrid1.Col = MSHFlexGrid1.LeftCol
MSHFlexGrid2.TopRow = MSHFlexGrid1.TopRow
MSHFlexGrid2.LeftCol = MSHFlexGrid1.LeftCol
End Sub
Private Sub MSHFlexGrid1_Scroll()
MSHFlexGrid1.Row = MSHFlexGrid1.TopRow
MSHFlexGrid1.Col = MSHFlexGrid1.LeftCol
MSHFlexGrid2.TopRow = MSHFlexGrid1.TopRow
MSHFlexGrid2.LeftCol = MSHFlexGrid1.LeftCol
End Sub
可是你的代码的试了不行呀?没有反应。不好意思问一下,你的代码测试了吗?
你引用的是MSHFlexGrid1?你注意我引用的是MSFlexGrid1(用法完全一样)只是名称不一样
'作用:MSFlexGrid2同步MSFlexGrid1运动(同时改变列宽、水平垂直滚动)
'Form1上放 MSFlexGrid1 、MSFlexGrid2、 Timer1
'复制下列代码,即可验证
'--------------------------------------------
'声明全局变量
Dim blMove As Boolean '列宽改变标志
Dim iColWidth() As Integer '存放MSFlexGrid1列宽数组Private Sub Form_Load()
blMove = False '开始时当然没移动了
MSFlexGrid1.Cols = 15
MSFlexGrid1.Rows = 100
MSFlexGrid2.Cols = 15
MSFlexGrid2.Rows = 100
MSFlexGrid1.ScrollTrack = True '数据同时滚动
MSFlexGrid2.ScrollTrack = True
ReDim iColWidth(MSFlexGrid1.Cols) '根据实际列宽重新定义记录数组的大小
ReDim bColVisible(MSFlexGrid1.Cols) '根据实际列宽重新定义数组的大小For i = 0 To MSFlexGrid1.Cols - 1
iColWidth(i) = MSFlexGrid1.ColWidth(i)
Next
For i = 0 To MSFlexGrid1.Rows - 1
For j = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid1.TextMatrix(i, j) = i & "," & j
MSFlexGrid2.TextMatrix(i, j) = i & "," & j
Next j
Next i
Timer1.Enabled = True
Timer1.Interval = 100
End SubPrivate Sub MSFlexGrid1_Scroll()
MSFlexGrid1.Row = MSFlexGrid1.TopRow
MSFlexGrid1.Col = MSFlexGrid1.LeftCol
MSFlexGrid2.TopRow = MSFlexGrid1.TopRow
MSFlexGrid2.LeftCol = MSFlexGrid1.LeftCol
End SubPrivate Sub Timer1_Timer()
Call CheckWidth '检查是否列宽改变了
If blMove Then '如果改变了
For i = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid2.ColWidth(i) = MSFlexGrid1.ColWidth(i)
Next
End If
'重新记录列宽
For i = 0 To MSFlexGrid1.Cols - 1
iColWidth(i) = MSFlexGrid1.ColWidth(i)
Next
blMove = False
End SubSub CheckWidth() '检查是否列宽改变了
For i = 0 To MSFlexGrid1.Cols - 1
If MSFlexGrid1.ColWidth(i) <> iColWidth(i) Then
blMove = True
Exit For
End If
Next
End Sub