Thêm, Sửa, Xóa trên ListView

Liên hệ QC

msc0506

Thành viên chính thức
Tham gia
14/4/08
Bài viết
56
Được thích
12
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
 
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

Trên diễn đàn đã có rất nhiều về vấn đề này. Bạn chịu khó tìm kiếm nhé.

1. Lấy dữ liệu từ ListView : Hàng i

PHP:
    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
2. Sửa dữ liệu hàng i thì làm tương tự


3. Thêm mới dữ liệu vào ListView

PHP:
           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
4. Xóa hàng i:
PHP:
Me.H_LV.ListItems.Remove (i)
Nhìn chung là như vậy.


Thân!
 
Upvote 0
Em làm thêm, xóa được rồi nhưng còn sửa thì em chưa hiểu cho lắm (em viết bằng C#) nhờ các anh, chị giúp em
 
Upvote 0
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.
 
Upvote 0
Upvote 0
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:

Mã:
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
Đồ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ùng
 

File đính kèm

  • Sealand 003.xls
    37 KB · Đọc: 322
Lần chỉnh sửa cuối:
Upvote 0
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:

Mã:
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
Đồ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ùng
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 hay
Em đã làm được vụ kéo thả tại đây: http://www.giaiphapexcel.com/forum/showthread.php?7146-Đố-vui-về-VBA!&p=292742#post292742
Còn vụ kéo Item trong chính Listview thì... đang nghiên cứu
Còn đây là code cho UserForm với 1 ListBox (listbox chứ hổng phải Listview nha)... có khả năng kéo thả các Item đây
PHP:
Private mobjFromList As MSForms.ListBox
Private mlFrom As Long
PHP:
Private Sub UserForm_Initialize()
  Dim i As Long
  For i = 0 To 50
    Me.ListBox1.AddItem "Item " & i
  Next
End Sub
PHP:
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
PHP:
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
PHP:
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
Có ai biết vụ Drag&Drop trong Listview không, chia sẽ với
 

File đính kèm

  • ListBoxDrag&Drop.xls
    35.5 KB · Đọc: 207
Upvote 0

Với code này:
PHP:
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

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.



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:

Mã:
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
Đồ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ùng

Với code của Anh Sealand đúng là Scroll thực sự, nhưng nếu có thể Anh làm ơn viết nó thành dạng
Public Sub ListViewMoveToTop(ByVal lv As ListView) có được không ạ?

Và nếu chọn k là số hàng hiện trên ListView thì làm sao xác định được là bao nhiêu hàng ạ?

Xin cám ơn.
 
Upvote 0
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.
Trời ơi... thì áp code của anh sealand vào là xong mà
PHP:
Private Sub Listview1_DblClick()
  ListViewMoveToTop ListView1
  ListView1.ListItems(1).EnsureVisible
End Sub
PHP:
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
PHP:
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
 

File đính kèm

  • Listview_Example.xls
    32 KB · Đọc: 280
Upvote 0
Thậ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!

Nhưng phải công nhận Thầy quá siêu, chỉ nhìn chút là "Ẹc Ẹc" rồi hihihi. Cám ơn Thầy rất nhiều, nhờ bài Thầy em có nhiều hướng mới!
 
Lần chỉnh sửa cuối:
Upvote 0
Thậ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?
 
Upvote 0
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?

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.
 
Upvote 0
Mới sưu tầm trên mạng 1 File này, có thể học hỏi thêm ListView một cách cơ bản được.
 

File đính kèm

  • UFScroll.zip
    39.2 KB · Đọc: 257
Upvote 0
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)
 
Lần chỉnh sửa cuối:
Upvote 0
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)

Đúng là như vậy, song khi em mở Form Zoom, ListView tự động thay đổi số hàng hiển thị, chẳng biết làm sao mà làm cho nó đúng!

Code của Anh Seland là thuộc tính ItemClick, em lại muốn chuyển thành macro, nhưng trình độ abc quá nên chẳng biết làm sao.

Dù sao cũng cám ơn Thầy ndu96081631và Anh Sealand rất nhiều ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Xin 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).
 

File đính kèm

  • Sealand_Hoc.xls
    38.5 KB · Đọc: 102
Upvote 0
Xin 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).
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... Next
PHP:
Private Sub CommandButton1_Click()
  Dim lsvItem As ListItem
  For Each lsvItem In Me.ListView1.ListItems
    lsvItem.Checked = True
  Next
End Sub
lsvItem.Checked = False là UnCheck
 
Upvote 0
Code như sau:
Mã:
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
 
Upvote 0
Cám ơn Anh NDU, cám ơn Anh Seland, còn phần Remove nhiều mục đã check và xóa luôn những mục đó trong sheet thì sao ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom