ListView : Double-click các item trong một listview

Liên hệ QC

nanona347

Thành viên mới
Tham gia
27/5/12
Bài viết
8
Được thích
0
Xin chào mọi người !
Em có một ListView trong một cửa sổ “Dialog” với nhiều “item” . Em có thể chọn được các item trong listview, nhưng chỉ highlight được item mà thôi. Em cần sau khi chọn item thì double-click lên item đó luôn. Mong mọi người giúp đỡ.
Em xin cám ơn trước !
 
Bạn Double click vào Listview để làm gì mới được? (vì trên listview có rất nhiều sự kiện)
Cám ơn bạn đã quan tâm!
Mình cần double-click để mở item đó. Vì đây là cửa sổ dialog của một chương trình dùng để chọn file để open, nên khi double-click sẽ mở file (item) trong listview. Mình đã có thể chọn được item trong listview dưới dạng highlight rồi, nhưng cần double-click vào item vừa chọn để mở item đó bằng phần mềm. Mong mọi người giúp đỡ !
 
Upvote 0
Bạn tham khảo file ví dụ sau để áp dụng nha
Đây là file liệt kê file Excel và chọn Click để mở.
 

File đính kèm

  • Listview.xls
    42.5 KB · Đọc: 180
Upvote 0
Bạn tham khảo file ví dụ sau để áp dụng nha
Đây là file liệt kê file Excel và chọn Click để mở.

Cám ơn bạn đã xem qua nhưng ý mình là dùng VBA trong Excel để select và double-click một item trong một listview của một chương trình khác. Hiện tại mình có đoạn code chỉ có thể select (highlight) item trong listview mà thôi,mình cần đoạn code nào có thể gửi lệnh từ excel để double-click lên item. Chẳng hạn thông qua lệnh SendMessage....Mình biết có lệnh LVM_SETITEMSTATE nhưng chỉ là select dạng highlight, còn double-click lên item luôn thì không biết, mong mọi người giúp đỡ !
 
Upvote 0
Cám ơn bạn đã xem qua nhưng ý mình là dùng VBA trong Excel để select và double-click một item trong một listview của một chương trình khác. Hiện tại mình có đoạn code chỉ có thể select (highlight) item trong listview mà thôi,mình cần đoạn code nào có thể gửi lệnh từ excel để double-click lên item. Chẳng hạn thông qua lệnh SendMessage....Mình biết có lệnh LVM_SETITEMSTATE nhưng chỉ là select dạng highlight, còn double-click lên item luôn thì không biết, mong mọi người giúp đỡ !

Sao bạn không nói ngay cái đỏ đỏ để người khác khỏi mất công? Bạn nên rút kinh nghiệm.

1. Bạn cho biết chương trình kia là ct nào. Người viết code đôi khi cũng phải test chứ có phải mở notepad ra viết và biết chắc chắn code sẽ chuẩn ngay đâu.
2. Bạn cho biết khi đúp chuột bằng tay thì có gì sẩy ra. Là mở ra các mục con (dấu + chuyển thành -)? Hay là gì?

Bạn nên mô tả trên ví dụ cụ thể. VD. khi mở ct abc thì ở dòng klm có itêm tên là hichic. Tôi muốn dùng code để mở hichic để thấy được item con blala. Code sẽ click vào item blala để ...

Mô ta cụ thể đại loại như trên. Đừng bắt người khác phải đoán ý của bạn

Bạn cho biết chương trình là gì. Nếu bạn có ct thì có thể gửi lên GPE không? Nếu nặng quá thì gửi lên www.mediafire.com rồi cung cấp đường dẫn.
 
Upvote 0
Sao bạn không nói ngay cái đỏ đỏ để người khác khỏi mất công? Bạn nên rút kinh nghiệm.

1. Bạn cho biết chương trình kia là ct nào. Người viết code đôi khi cũng phải test chứ có phải mở notepad ra viết và biết chắc chắn code sẽ chuẩn ngay đâu.
2. Bạn cho biết khi đúp chuột bằng tay thì có gì sẩy ra. Là mở ra các mục con (dấu + chuyển thành -)? Hay là gì?

Bạn nên mô tả trên ví dụ cụ thể. VD. khi mở ct abc thì ở dòng klm có itêm tên là hichic. Tôi muốn dùng code để mở hichic để thấy được item con blala. Code sẽ click vào item blala để ...

Mô ta cụ thể đại loại như trên. Đừng bắt người khác phải đoán ý của bạn

Bạn cho biết chương trình là gì. Nếu bạn có ct thì có thể gửi lên GPE không? Nếu nặng quá thì gửi lên www.mediafire.com rồi cung cấp đường dẫn.

Cảm ơn bạn đã góp ý! Vì lần đầu post bài nên có nhiều sai sót, mình xin rút kinh nghiệm!


  1. Bạn có thể lấy listview “Uninstall/Change” trong mục “Control Panel > Program and Features” của Window 7 để test cũng được, chương trình của mình cũng có listview gần giống như vậy (cũng cần double-click lên các item để mở item đó)
  2. Tên ,thứ tự các item , item có thư mục con hay không… trong listview mình đều đã biết trước
  3. Khi double click lên một item trong listview thì đúng như bạn đoán là nếu item có thư mục con bên trong thì sẽ mở ra các mục con (dấu + chuyển thành -), sau đó sẽ double click vào các thư mục con này. Nếu item ko có thư mục con thì không có dấu + nên chỉ cần double click một lần là được
  4. Ngay sau khi double click vào item thì file đó sẽ được mở trên phần mềm
Mình đã có thể lấy handle của listview và select item theo index của nó trong listview. Mình nghĩ chỉ cần có thể double click lên item là được rồi, việc mở các thư mục con trong item cũng sẽ tương tự như những item ko có thư mục con (chỉ lưu ý là phải double-click, chứ chỉ click chuột trái 1 lần thì cũng không được)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn đã góp ý! Vì lần đầu post bài nên có nhiều sai sót, mình xin rút kinh nghiệm!


  1. Bạn có thể lấy listview “Uninstall/Change” trong mục “Control Panel > Program and Features” của Window 7 để test cũng được, chương trình của mình cũng có listview gần giống như vậy (cũng cần double-click lên các item để mở item đó)
  2. Tên ,thứ tự các item , item có thư mục con hay không… trong listview mình đều đã biết trước
  3. Khi double click lên một item trong listview thì đúng như bạn đoán là nếu item có thư mục con bên trong thì sẽ mở ra các mục con (dấu + chuyển thành -), sau đó sẽ double click vào các thư mục con này. Nếu item ko có thư mục con thì không có dấu + nên chỉ cần double click một lần là được
  4. Ngay sau khi double click vào item thì file đó sẽ được mở trên phần mềm
Mình đã có thể lấy handle của listview và select item theo index của nó trong listview. Mình nghĩ chỉ cần có thể double click lên item là được rồi, việc mở các thư mục con trong item cũng sẽ tương tự như những item ko có thư mục con (chỉ lưu ý là phải double-click, chứ chỉ click chuột trái 1 lần thì cũng không được)

Chỗ đỏ đỏ: khi tôi viết thì trong đầu tôi lại nghĩ tới TreeView nên tôi viết "các mục con (dấu + chuyển thành -)". Nhưng bạn lại khẳng định cái tôi viết. Vậy thì bạn có TreeView hay ListView? Vì Item của ListView thì làm gì có Item con? (tôi không nói tới SubItem) và ListView làm gì có +/-?

Chỗ xanh xanh: không hẳn thế bạn ạ. Khi tôi test code trên CT của bạn mà tôi thấy "file đó sẽ được mở trên phần mềm" thì tôi biết code đã làm được cái tôi muốn. Còn khi tôi đúp chuột trên Item của “Uninstall/Change” thì làm gì có cái gì sẩy ra đâu. Vậy nếu tôi test code với “Uninstall/Change” thì bằng cách nào tôi biết được là code đã làm được cái tôi muốn?
 
Upvote 0
Chỗ đỏ đỏ: khi tôi viết thì trong đầu tôi lại nghĩ tới TreeView nên tôi viết "các mục con (dấu + chuyển thành -)". Nhưng bạn lại khẳng định cái tôi viết. Vậy thì bạn có TreeView hay ListView? Vì Item của ListView thì làm gì có Item con? (tôi không nói tới SubItem) và ListView làm gì có +/-?

Chỗ xanh xanh: không hẳn thế bạn ạ. Khi tôi test code trên CT của bạn mà tôi thấy "file đó sẽ được mở trên phần mềm" thì tôi biết code đã làm được cái tôi muốn. Còn khi tôi đúp chuột trên Item của “Uninstall/Change” thì làm gì có cái gì sẩy ra đâu. Vậy nếu tôi test code với “Uninstall/Change” thì bằng cách nào tôi biết được là code đã làm được cái tôi muốn?

Chỗ đỏ đỏ : mình ko biết tại sao nhưng khi dùng Spy++ để check thì mình được thông báo là nó thuộc class name : SysListView32 (List view) mặc dù vẫn có dấu +/- và các item con
Chỗ xanh xanh : khi kích đúp chuột vào một item trong “Uninstall/Change” của Window 7 thì cửa sổ Uninstall (hoặc bất kỳ hộp thoại hay cửa sổ nào) của phần mềm tương ứng sẽ hiện ra mà bạn. Ý mình khi lấy listview này để test là chính vì lý do đó mà (chỉ cần có hộp thoại hay cửa sổ hiện ra sau lệnh double-click là xem như code đã chạy thành công)
 
Upvote 0
Chỗ đỏ đỏ : mình ko biết tại sao nhưng khi dùng Spy++ để check thì mình được thông báo là nó thuộc class name : SysListView32 (List view) mặc dù vẫn có dấu +/- và các item con
Chỗ xanh xanh : khi kích đúp chuột vào một item trong “Uninstall/Change” của Window 7 thì cửa sổ Uninstall (hoặc bất kỳ hộp thoại hay cửa sổ nào) của phần mềm tương ứng sẽ hiện ra mà bạn. Ý mình khi lấy listview này để test là chính vì lý do đó mà (chỉ cần có hộp thoại hay cửa sổ hiện ra sau lệnh double-click là xem như code đã chạy thành công)

Tôi dùng XP nên thấy thế. Có dịp có lẽ tôi phải xem trong Windows 7 mới được.
 
Upvote 0
Tôi dùng XP nên thấy thế. Có dịp có lẽ tôi phải xem trong Windows 7 mới được.

Rất mong được bác và mọi người giúp đỡ. Nếu bác ko sử dụng Window7 nên ko thể test thì bác có thể làm trên một listview bất kỳ nào mà bác có cũng được, vì em chỉ cần tham khảo lệnh nào trong VBA để gọi được double-click lên item mà thôi. Hoặc nếu bác ko có thời gian cũng có thể gợi ý cho em vài hướng đi của code cũng được, xin cám ơn!
 
Upvote 0
Rất mong được bác và mọi người giúp đỡ. Nếu bác ko sử dụng Window7 nên ko thể test thì bác có thể làm trên một listview bất kỳ nào mà bác có cũng được, vì em chỉ cần tham khảo lệnh nào trong VBA để gọi được double-click lên item mà thôi. Hoặc nếu bác ko có thời gian cũng có thể gợi ý cho em vài hướng đi của code cũng được, xin cám ơn!

Nếu Spy++ đọc ra là SysListView32 chứ không phải là SysTreeView32 thì phải đúng thế rồi vì nó chắc chắn không đọc sai. Như thế là ListView được tạo theo "mốt" cho giống TreeView.
Tôi đã xem "Uninstall/Install trên máy có Windows7 Starter nhưng nó y hệt như trên XP của tôi, và trông y hết như ListView trong VBA với các dòng (Item) và các cột (SubItem)
------------
Lúc trước tôi nghĩ là ListView như tôi đã tưởng nên có 1 ý tưởng. Cần nhấn mạnh là tôi chưa bao giờ giả click trên ListView bao giờ. Đọc các item thì có rồi nhưng DblClick thì chưa. Vậy tôi không dám chắc là code đi đúng hướng và viết chuẩn. Nếu có lỗi hoặc "không phải đường này" thì tôi chịu vì hết ý tưởng rồi. Khỏi phải hỏi cho mất công.

Ý tưởng là giả double click trên ListView. Nhưng đã là nhấn chuột thì cũng phải cung cấp tọa độ điểm nhấn. Tôi xác định hình chữ nhật có chứa text của Item - hình chữ nhật mà khi chọn Item thì sẽ được "bôi đen" ấy. Sau đó lấy ra 1 điểm thuộc hình chữ nhật để làm điểm nhấn chuột. Tôi chọn điểm giao của 2 đường chéo.

Code thử giả DblClick trên ListView có handle là hListView, trên vị trí của Item có ItemIndex. Tức Item đầu tiên có ItemIndex = 0, tiếp theo có ItemIndex = 1, ...

Tôi viết code dùng Excel VBA nhưng bạn thử viết code trong VB6 xem sao

Mã:
Private Const WM_LBUTTONDBLCLK As Long = &H203
Private Const MK_LBUTTON As Long = &H1
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETITEMRECT As Long = (LVM_FIRST + 14)
Private Const LVIR_LABEL As Long = 2

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private 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 Long

Sub DoDblClick(ByVal hListView As Long, ByVal ItemIndex As Long)
Dim rc As RECT, x As Long, y As Long
    rc.Left = LVIR_LABEL
    SendMessage hListView, LVM_GETITEMRECT, ItemIndex, rc
    x = (rc.Left + rc.Right) \ 2
    y = (rc.Top + rc.Bottom) \ 2
    SendMessage hListView, WM_LBUTTONDBLCLK, MK_LBUTTON, 65536 * y + x
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các Bác

em đang sử dụng Listview để hiển thị 1 bảng nằm trong sheet 1 Excel, sau đó lựa chọn 1 vài hàng trong Listview, sau đó mong muốn các hàng đã được lựa chọn trong Listview được đẩy vào trong sheet1 của Excel. Vậy Code để xác định hàng nào trong listview đã được lựa chọn là gì ạ?
Rất mong các Bác chỉ giáo giúp em với ạ.
 
Upvote 0
Vậy Code để xác định hàng nào trong listview đã được lựa chọn là gì ạ?
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom