ListView绑定TextBox,在ListView中按下方向键,TextBox位置保持不变,如何实现相对移动,即让TextBox跟随ListView中绑定的SubItem移动.代码大致如下:
Private Sub lvw_ItemCheck(Index As Integer, ByVal Item As MSComctlLib.ListItem)
On Error GoTo err
With Me
If Len(Item.Text) <> 0 And Item.Checked = True Then
.txtOQTY.Move .lvw(Index).ColumnHeaders(5).Left, Item.Top + Item.Height, .lvw(Index).ColumnHeaders(5).Width, Item.Height
.txtNQTY.Move .lvw(Index).ColumnHeaders(6).Left, Item.Top + Item.Height, .lvw(Index).ColumnHeaders(6).Width, Item.Height
Else
.txtOQTY.Visible = False
.txtNQTY.Visible = False
End If
End With
Exit Sub
End Sub
'写Click是因为当Checked Item被选中时 恢复TextBox显示,以及对应数据考虑
Private Sub lvw_ItemClick(Index As Integer, ByVal Item As MSComctlLib.ListItem)
On Error GoTo err
With Me
If Len(Item.Text) <> 0 And Item.Checked = True Then
.txtOQTY.Move .lvw(Index).ColumnHeaders(5).Left, Item.Top + Item.Height, .lvw(Index).ColumnHeaders(5).Width, Item.Height
.txtNQTY.Move .lvw(Index).ColumnHeaders(6).Left, Item.Top + Item.Height, .lvw(Index).ColumnHeaders(6).Width, Item.Height
Else
.txtOQTY.Visible = False
.txtNQTY.Visible = False
End If
End With
Exit Sub
End SubPrivate Sub lvw_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
On Error GoTo err
With Me
If (KeyCode = 37) Or (KeyCode = 39) Then
If Len(.lvw(Index).SelectedItem.Text) <> 0 And .lvw(Index).SelectedItem.Checked = True Then
.txtOQTY.Move .lvw(Index).ColumnHeaders(5).Left, .lvw(Index).SelectedItem.Top + .lvw(Index).SelectedItem.Height, .lvw(Index).ColumnHeaders(5).Width, .lvw(Index).SelectedItem.Height
.txtNQTY.Move .lvw(Index).ColumnHeaders(6).Left, .lvw(Index).SelectedItem.Top + .lvw(Index).SelectedItem.Height, .lvw(Index).ColumnHeaders(6).Width, .lvw(Index).SelectedItem.Height
End If
End If
End With
Exit Sub
End Sub
谢谢各位帮忙
就是ListView下面有多个列时,水平滚动条就出来了.而我的TextBox绑定到了一个列上.当TextBox显示时,我按下左右方向键,水平滚动条会左右移动,看着感觉TextBox在跟随移动.我就是想让TextBox保持绑定的位置.各位帅哥美女帮帮忙,谢谢
Private Const LVM_GETSUBITEMRECT As Long = (LVM_FIRST + 56)
Private Const LVIR_BOUNDS As Long = 0
Private Const LVIR_ICON As Long = 1
Private Const LVIR_LABEL As Long = 2Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByRef lParam As Any) As LongPrivate Declare Function MapWindowPoints Lib "user32.dll" ( _
ByVal hwndFrom As Long, _
ByVal hwndTo As Long, _
ByRef lppt As Any, _
ByVal cPoints As Long) As LongPrivate Declare Function MoveWindow Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As LongPrivate Sub Command1_Click()
Dim rc As RECT, i As Long
For i = 5 To 6
rc.Top = i - 1
rc.Left = LVIR_BOUNDS
SendMessage ListView1.hwnd, LVM_GETSUBITEMRECT, ListView1.SelectedItem.Index - 1, rc
MapWindowPoints ListView1.hwnd, Me.hwnd, rc, 2
MoveWindow IIf(i = 5, txtOQTY.hwnd, txtNQTY.hwnd), _
rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, 1
Next
End Sub
给出的例子是如何将 TextBox 移动到正确的位置,你自己改为在不同的事件中调用。
我的代码经过测试完全可用的,只要保证 ListView 和两个 TextBox 属于同一个 Container。
我的代码经过测试完全可用的,只要保证 ListView 和两个 TextBox 属于同一个 Container。