Mình đang cần code thêm sửa xóa trực tiếp trên ListView . Cao thủ nào đã vọc rồi hoặc có ví dụ về vấn đề này giúp mình với nhé, Minh đang cần
Cảm ơn trước
i = Me.H_LV.SelectedItem.Index
Ma = Me.H_LV.SelectedItem.Text ' Cot 1
With Me.H_LV.ListItems.Item(i)
Me.H_CBTrainMa = .SubItems(1) ' Cot 2
Me.H_TBTrainTen = .SubItems(2) ' Cot 3
Me.H_CBPeriodMa = .SubItems(3)
Me.H_TBStart = Format(.SubItems(4), "dd/mm/yyyy")
Me.H_TBFinish = Format(.SubItems(5), "dd/mm/yyyy")
Me.H_CBLocationMa = .SubItems(6)
Me.H_CBCategoryMa = .SubItems(7)
Me.H_CBVenueMa = .SubItems(8)
Me.H_CBTrainerMa = .SubItems(9)
End With
iRLV = .H_LV.ListItems.Count + 1
' Luu vao cot dau hang cuoi List View
.H_LV.ListItems.Add().Text = .H_TBID
With .H_LV.ListItems.Item(iRLV)
.SubItems(1) = Me.H_CBTrainMa ' Cot 2
.SubItems(2) = Me.H_TBTrainTen ' Cot 3
.SubItems(3) = Me.H_CBPeriodMa ' Cot 4
.SubItems(4) = Me.H_TBStart 'Cot 5
.SubItems(5) = Me.H_TBFinish ' Cot 6
.SubItems(6) = Me.H_CBLocationMa ' Cot 7
.SubItems(7) = Me.H_CBCategoryMa ' Cot 8
.SubItems(8) = Me.H_CBVenueMa ' Cot 9
.SubItems(9) = Me.H_CBTrainerMa ' Cot 10
End With
Me.H_LV.ListItems.Remove (i)
Xem tạm cái này nhé (dù không hay cho lắm)Xin vui lòng cho hỏi, có thể chọn bất kỳ hàng nào trong ListView, thì hàng đó chuyển lên (scroll lên trên, không phải sort) lên trên cùng của ListView hay không?
Xin cám ơn rất nhiều.
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
Dim k 'So dong hien thi cua Listview
k = 12
Me.ListView1.ListItems(Item.Index).EnsureVisible
Me.ListView1.ListItems(Item.Index + k).EnsureVisible
Me.ListView1.SelectedItem = Me.ListView1.ListItems(Item.Index)
End Sub
Như ta biết thì Listview có thể OLE_Dragdrop (giống như các control trong VB vậy) nên nó có khả năng kéo thả rất hayTheo mình nên đơn giản hoá vấn đề thôi, bạn thử cách "thủ công" của mình xem sao:
Đồng thời Listview phải thêm số dòng trống bằng số dong của Listview để dòng cuối cùng có thể lên trên cùngMã:Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) Dim k 'So dong hien thi cua Listview k = 12 Me.ListView1.ListItems(Item.Index).EnsureVisible Me.ListView1.ListItems(Item.Index + k).EnsureVisible Me.ListView1.SelectedItem = Me.ListView1.ListItems(Item.Index) End Sub
Private mobjFromList As MSForms.ListBox
Private mlFrom As Long
Private Sub UserForm_Initialize()
Dim i As Long
For i = 0 To 50
Me.ListBox1.AddItem "Item " & i
Next
End Sub
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim objData As DataObject, lEffect As Long
If Button = 1 Then
Set objData = New DataObject
Set mobjFromList = Me.ListBox1
objData.SetText Me.ListBox1.Text
mlFrom = Me.ListBox1.ListIndex
lEffect = objData.StartDrag
End If
End Sub
Private Sub ListBox1_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal DragState As MSForms.fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
Cancel = True: Effect = fmDropEffectMove
End Sub
Private Sub ListBox1_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As MSForms.fmAction, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
Dim lTo As Long
With Me.ListBox1
lTo = .TopIndex + Int(Y * 0.85 / .Font.Size)
If lTo >= .ListCount Then lTo = .ListCount
Cancel = True
Effect = fmDropEffectMove
.AddItem Data.GetText, lTo
If mobjFromList = Me.ListBox1 And lTo < mlFrom Then
mobjFromList.RemoveItem (mlFrom + 1)
Else
mobjFromList.RemoveItem mlFrom
End If
Set mobjFromList = Nothing
End With
End Sub
Xem tạm cái này nhé (dù không hay cho lắm)
http://www.xtremevbtalk.com/showthread.php?t=299439
Public Sub ListViewMoveToTop(ByVal lv As ListView)
Dim bWasUnSel As Boolean
Dim tmpLvItem As ListItem
Dim newLvItem As ListItem
Dim tmpSubItem As ListSubItem
Dim i As Integer
bWasUnSel = False
For i = 1 To lv.ListItems.Count
Set tmpLvItem = lv.ListItems(i)
If tmpLvItem.Selected Then
If bWasUnSel Then
Set newLvItem = lv.ListItems.Add(1, , tmpLvItem.Text)
newLvItem.Tag = tmpLvItem.Tag
newLvItem.Checked = tmpLvItem.Checked
newLvItem.Key = tmpLvItem.Key
For Each tmpSubItem In tmpLvItem.ListSubItems
newLvItem.SubItems(tmpSubItem.Index) = tmpSubItem.Text
Next
lv.ListItems.Remove (tmpLvItem.Index)
newLvItem.Selected = True
Set newLvItem = Nothing
End If
Else
bWasUnSel = True
End If
Set tmpLvItem = Nothing
Next
End Sub
Theo mình nên đơn giản hoá vấn đề thôi, bạn thử cách "thủ công" của mình xem sao:
Đồng thời Listview phải thêm số dòng trống bằng số dong của Listview để dòng cuối cùng có thể lên trên cùngMã:Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem) Dim k 'So dong hien thi cua Listview k = 12 Me.ListView1.ListItems(Item.Index).EnsureVisible Me.ListView1.ListItems(Item.Index + k).EnsureVisible Me.ListView1.SelectedItem = Me.ListView1.ListItems(Item.Index) End Sub
Trời ơi... thì áp code của anh sealand vào là xong màNó chỉ chuyển dời từ một vị trí đang chọn Add lên trên Top và xóa cái đang chọn, chứ không thể Scroll lên trên nên chưa thể giải quyết được vấn đề của em.
Private Sub Listview1_DblClick()
ListViewMoveToTop ListView1
ListView1.ListItems(1).EnsureVisible
End Sub
Private Sub UserForm_Initialize()
Dim i As Long
ListView1.ColumnHeaders.Add , , "", 100
For i = 1 To 20
ListView1.ListItems.Add , , "Item" & i
Next
End Sub
Private Sub ListViewMoveToTop(ByVal lv As ListView)
Dim bWasUnSel As Boolean, tmpLvItem As ListItem, newLvItem As ListItem
Dim tmpSubItem As ListSubItem, i As Integer
bWasUnSel = False
For i = 1 To lv.ListItems.Count
Set tmpLvItem = lv.ListItems(i)
If tmpLvItem.Selected Then
If bWasUnSel Then
Set newLvItem = lv.ListItems.Add(1, , tmpLvItem.Text)
newLvItem.Tag = tmpLvItem.Tag
newLvItem.Checked = tmpLvItem.Checked
newLvItem.Key = tmpLvItem.Key
For Each tmpSubItem In tmpLvItem.ListSubItems
newLvItem.SubItems(tmpSubItem.Index) = tmpSubItem.Text
Next
lv.ListItems.Remove (tmpLvItem.Index)
newLvItem.Selected = True
Set newLvItem = Nothing
End If
Else
bWasUnSel = True
End If
Set tmpLvItem = Nothing
Next
End Sub
Bạn nói cuộn thế nào tôi chưa hiểuThật ra là em cũng dùng Double Click, khi chỉnh sửa lại Item của ListView em muốn nó cuộn lên để kiểm tra những cái dưới nữa ạ. Còn code đó chỉ chuyển dời 1 selectedItem từ dưới lên trên thôi.
Chẳng biết làm sao mà cuộn cái thanh Scroll của nó nữa! hic, cái ListView khó nhai thật!
Bạn nói cuộn thế nào tôi chưa hiểu
Cái của tôi là cuộn lên rồi đấy ---> Mà cuộn lên thì làm sao kiểm tra được cái dưới? Hay ý bạn muốn cuộn xuống đây?
Thì cái mà anh sealand đã làm ấy, chẳng đúng thế sao?Như vầy Thầy ơi, double click vào 1 Item, thì thanh cuộn sẽ cuộn xuống, và cái Iterm mình vừa chọn sẽ nằm trên Top, tức là chỉ cuộn thôi, không phải dời Item mình chọn lên Top, không biết có làm được không ạ? Sao em tìm thuộc tính nó hoài mà không ra.
Thì cái mà anh sealand đã làm ấy, chẳng đúng thế sao?
----------------
Ngoài ra, tôi cho rằng cái hay nhất của Listview chính là OLE_DragDrop ---> Nếu không có nhu cầu dùng đến món này thì cũng chẳng việc gì phải xài Listview cả (đó là chưa nói Listview không hổ trợ tiếng Việt Unicode... Mà hình như món nào có OLE_DragDrop đều thế cả thì phải)
Hỏng biết có cách nào 1 phát làm toàn bộ không nữa?... Tôi chỉ nghĩ được For... NextXin vui lòng cho hỏi:
- Để check và uncheck toàn bộ ListItems, code phải viết như thế nào?
- Khi check nhiều mục và muốn remove những mục này thì code phải viết làm sao? Và những mục đó xóa luôn trong sheet như thế nào.
Cám ơn rất nhiều
(xin mượn file của anh Sealand để thực hiện).
Private Sub CommandButton1_Click()
Dim lsvItem As ListItem
For Each lsvItem In Me.ListView1.ListItems
lsvItem.Checked = True
Next
End Sub
Private Sub Check()
Dim i
For i = 1 To Me.ListView1.ListItems.Count
If Me.ListView1.ListItems.Item(i).Checked = False Then Me.ListView1.ListItems.Item(i).Checked = True
Next
End Sub
Private Sub Uncheck()
Dim i
For i = 1 To Me.ListView1.ListItems.Count
If Me.ListView1.ListItems.Item(i).Checked = True Then Me.ListView1.ListItems.Item(i).Checked = False
Next
End Sub
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2