Listview trong VB.Net

Liên hệ QC

Thanh Bình PV

Thành viên hoạt động
Tham gia
30/10/19
Bài viết
151
Được thích
19
Bác nào rành VB.Net giúp em với ạ.. Em mới học mà mò mãi không làm được.
Em muốn lấy dữ liệu trong excel vào Listview có 3 cột.

z2375060059495_73a5caa195fd517047528e02ec042cbb.jpg

Và kết quả chỉ thêm vào được 1 cột. Các bác giúp em với ạ. Em cảm ơn.

z2375063105583_5eae61ddc8a502faddc2633f491f531b.jpg

Và cho em hỏi là thay thế Listview thành Listbox thì có được không ạ.

Mã:
    Private Sub frmTP1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'Dim i As Integer
        Dim xlWorkBook As Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
        Dim test(3) As String
        xlWorkSheet = xlWorkBook.Worksheets("Home")

        ListViewTP.Columns.Add("STT", 50, HorizontalAlignment.Center)
        ListViewTP.Columns.Add("Ten", 300, HorizontalAlignment.Center)
        ListViewTP.Columns.Add("Check", 50, HorizontalAlignment.Center)

        With xlWorkSheet
            Dim aaa As Object
            aaa = .Range(.Range("R6"), .Range("R6").End(4)).Resize(, 3).Value

            For Each item In aaa
                ListViewTP.Items.Add(item)
            Next
        End With
    End Sub
 
Bác nào rành VB.Net giúp em với ạ.. Em mới học mà mò mãi không làm được.
Em muốn lấy dữ liệu trong excel vào Listview có 3 cột.

View attachment 255305

Và kết quả chỉ thêm vào được 1 cột. Các bác giúp em với ạ. Em cảm ơn.

View attachment 255306

Và cho em hỏi là thay thế Listview thành Listbox thì có được không ạ.

Mã:
    Private Sub frmTP1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'Dim i As Integer
        Dim xlWorkBook As Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
        Dim test(3) As String
        xlWorkSheet = xlWorkBook.Worksheets("Home")

        ListViewTP.Columns.Add("STT", 50, HorizontalAlignment.Center)
        ListViewTP.Columns.Add("Ten", 300, HorizontalAlignment.Center)
        ListViewTP.Columns.Add("Check", 50, HorizontalAlignment.Center)

        With xlWorkSheet
            Dim aaa As Object
            aaa = .Range(.Range("R6"), .Range("R6").End(4)).Resize(, 3).Value

            For Each item In aaa
                ListViewTP.Items.Add(item)
            Next
        End With
    End Sub
Kết nối bằng ADO đẩy nó vào bằng Recordset nha bạn.
 
Không có cách nào đơn giản hơn ạ.. ADO thì em không biết gì về nó cả. :(
Bạn thử cách như sau nhé:

Mã:
Imports System.Data.OleDb

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim strConn As OleDbConnection
        Cursor = Cursors.WaitCursor
        Dim dt As DataSet
        Dim da As OleDbDataAdapter
        strConn = New OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & Application.StartupPath & "\ExcelData.xlsx';Extended Properties=Excel 12.0;")
        da = New OleDbDataAdapter("Select * From [Sheet1$]", strConn)
        dt = New DataSet
        da.Fill(dt)
        DataGridView1.DataSource = dt.Tables(0)
        strConn.Close()
        Cursor = Cursors.Default
    End Sub
End Class

1615539072351.png
 
Bạn thử cách như sau nhé:

Mã:
Imports System.Data.OleDb

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim strConn As OleDbConnection
        Cursor = Cursors.WaitCursor
        Dim dt As DataSet
        Dim da As OleDbDataAdapter
        strConn = New OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & Application.StartupPath & "\ExcelData.xlsx';Extended Properties=Excel 12.0;")
        da = New OleDbDataAdapter("Select * From [Sheet1$]", strConn)
        dt = New DataSet
        da.Fill(dt)
        DataGridView1.DataSource = dt.Tables(0)
        strConn.Close()
        Cursor = Cursors.Default
    End Sub
End Class
Em thử thì bị lỗi như vầy ạ. Không biết sai ở đâu hay do máy nữa.
Em có xem trên mạng thì bảo cài đặt Microsoft access database engine 2007 trở lên. Mà máy tính em đã có sẵn bản engine 2010 rồi.

1615540100130.png
 
Bạn nên tìm và download 'Microsoft Access Database Engine' phiên bản tương ứng vào máy bạn là chạy được.
Em đang dùng Excel 2016 và máy em thì có 2 bản Microsoft Access Database Engine 2010 và 2016. Em thử chạy nhưng vẫn bị lỗi.
Em đã thử gỡ cài đặt Microsoft Access Database Engine 2010 và chạy lại nhưng vẫn bị.
 
Em đang dùng Excel 2016 và máy em thì có 2 bản Microsoft Access Database Engine 2010 và 2016. Em thử chạy nhưng vẫn bị lỗi.
Em đã thử gỡ cài đặt Microsoft Access Database Engine 2010 và chạy lại nhưng vẫn bị.
Gỡ và cài theo đúng với phiên bản máy tính và office của bạn (Lưu ý 32bit và 64bit). Sau đó khởi động lại máy nhé.
 
Bạn viết sai cách của ListView. ListView.Items.Add() trả về object ListViewItem, từ đối tượng trả về này bạn tạo các cột bằng ListViewItem.SubItems.Add().
Bạn xem code ví dụ của tôi dưới đây sẽ rõ hơn. Tính huống của bạn là dữ liệu trong mảng 2 chiều thì dùng vòng lặp duyệt dòng rồi duyệt cột là xong.

ListView.jpg
 
Với đoạn code của bạn thì chỉ cần xử lý trong vòng lặp For thế này

C#:
        Dim li As ListViewItem
        For I As Integer = 1 To UBound(aaa, 1)
            li = ListView1.Items.Add(aaa(I, 1))
            For J As Integer = 2 To UBound(aaa, 2)
                li.SubItems.Add(aaa(I, J))
            Next J
        Next I
 
Với đoạn code của bạn thì chỉ cần xử lý trong vòng lặp For thế này
Em cảm ơn anh ạ. Cách của anh chạy tốt. Nhưng có 1 số vấn đề em bị vướng muốn hỏi anh ạ.
Trường hợp em không ẩn dữ liệu mấy dòng cuối thì vẫn có thể lấy dữ liệu bình thường. Nhưng nếu ví dụ em ẩn 3 dòng cuối (hoặc nhiều hơn) thì dữ liệu chỉ lấy tới ô "STT 86" thôi.. vậy có cách nào để lấy dữ liệu trong hàng bị ẩn ở cuối không ạ.

z2380308321045_5e6c373374505cb5ed6de0f4589bd975.jpgz2380309201436_75768029f788af10ab9d446df9701bb6.jpg

Gửi anh đoạn mã em có chỉnh sửa 1 ít cho phù hợp với dự liệu của em.
Mã:
...   
        With xlWorkSheet
            Dim aaa As Object
            aaa = .Range(.Range("R6"), .Range("S6").End(XlDirection.xlDown)).Resize(, 3).Value
            Dim li As ListViewItem
            For I As Integer = 1 To UBound(aaa, 1)
                If aaa(I, 1) IsNot Nothing Then
                    li = ListViewTP.Items.Add(aaa(I, 1))
                Else
                    li = ListViewTP.Items.Add("")
                End If
                For J As Integer = 2 To UBound(aaa, 2)
                    If aaa(I, J) IsNot Nothing Then
                        li.SubItems.Add(aaa(I, J))
                    Else
                        li.SubItems.Add("")
                    End If
                Next J
            Next I
        End With
...
Đơn giản là bạn chỉnh lại chuỗi truy vấn thôi. Bạn gửi file Excel mẫu lên tôi xem thử nhé.
Em gửi anh file trong đính kèm. Em cũng muốn biết thêm cách lấy dữ liệu 1 phạm vi bằng ADO. Em cảm ơn.
 

File đính kèm

  • GPE.xlsx
    74.8 KB · Đọc: 17
Muốn lấy dữ liệu không ẩn thì có 3 cách.
1. Phải hủy bỏ trạng thai Filter của vùng trong Excel trước khi nhận mảng aaa
2. Không lấy dữ liệu theo mảng aaa, chạy vòng lặp duyệt từng dòng của Range để lấy vào ListView.
3. Dùng cách lấy dữ liệu vào Recordset bằng ADO sau đó chạy vòng lặp duyệt từng record trong Recordset để nhặt vào ListView.
 
Em cảm ơn anh ạ. Cách của anh chạy tốt. Nhưng có 1 số vấn đề em bị vướng muốn hỏi anh ạ.
Trường hợp em không ẩn dữ liệu mấy dòng cuối thì vẫn có thể lấy dữ liệu bình thường. Nhưng nếu ví dụ em ẩn 3 dòng cuối (hoặc nhiều hơn) thì dữ liệu chỉ lấy tới ô "STT 86" thôi.. vậy có cách nào để lấy dữ liệu trong hàng bị ẩn ở cuối không ạ.


Gửi anh đoạn mã em có chỉnh sửa 1 ít cho phù hợp với dự liệu của em.
Mã:
...  
        With xlWorkSheet
            Dim aaa As Object
            aaa = .Range(.Range("R6"), .Range("S6").End(XlDirection.xlDown)).Resize(, 3).Value
            Dim li As ListViewItem
            For I As Integer = 1 To UBound(aaa, 1)
                If aaa(I, 1) IsNot Nothing Then
                    li = ListViewTP.Items.Add(aaa(I, 1))
                Else
                    li = ListViewTP.Items.Add("")
                End If
                For J As Integer = 2 To UBound(aaa, 2)
                    If aaa(I, J) IsNot Nothing Then
                        li.SubItems.Add(aaa(I, J))
                    Else
                        li.SubItems.Add("")
                    End If
                Next J
            Next I
        End With
...

Em gửi anh file trong đính kèm. Em cũng muốn biết thêm cách lấy dữ liệu 1 phạm vi bằng ADO. Em cảm ơn.
Bạn thử code sau nhé:
Mã:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim strConn As OleDbConnection
        Cursor = Cursors.WaitCursor
        Dim dt As DataSet
        Dim da As OleDbDataAdapter
        strConn = New OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & Application.StartupPath & "\GPE.xlsx';Extended Properties=""Excel 12.0;HDR=No;""")
        da = New OleDbDataAdapter("Select * From [Home$R6:T] Where F2 Is Not Null", strConn)
        dt = New DataSet
        da.Fill(dt)
        DataGridView1.DataSource = dt.Tables(0)
        strConn.Close()
        Cursor = Cursors.Default
    End Sub
 
Muốn lấy dữ liệu không ẩn thì có 3 cách.
1. Phải hủy bỏ trạng thai Filter của vùng trong Excel trước khi nhận mảng aaa
2. Không lấy dữ liệu theo mảng aaa, chạy vòng lặp duyệt từng dòng của Range để lấy vào ListView.
3. Dùng cách lấy dữ liệu vào Recordset bằng ADO sau đó chạy vòng lặp duyệt từng record trong Recordset để nhặt vào ListView.
Em cảm ơn. Để em chạy thử ạ.
Bạn thử code sau nhé:
Mã:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim strConn As OleDbConnection
        Cursor = Cursors.WaitCursor
        Dim dt As DataSet
        Dim da As OleDbDataAdapter
        strConn = New OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & Application.StartupPath & "\GPE.xlsx';Extended Properties=""Excel 12.0;HDR=No;""")
        da = New OleDbDataAdapter("Select * From [Home$R6:T] Where F2 Is Not Null", strConn)
        dt = New DataSet
        da.Fill(dt)
        DataGridView1.DataSource = dt.Tables(0)
        strConn.Close()
        Cursor = Cursors.Default
    End Sub
Code hoạt động tốt ạ. Cho e hỏi đoạn này "Where F2 Is Not Null" là có 1 danh sách các chuỗi để thực hiện lọc theo điều kiện phải không ạ.

Em còn 2 vấn đề cuối muốn nhờ 2 anh hỗ trợ.
Em tạo 1 ribbon sử dụng VSTO và trong ribbon có 1 button gọi Form1 bao gồm 1 Listview và 1 button export như hình.
123.jpg
- Sau khi đã thêm được dữ liệu vào Listview (hoặc Datagridview).
Vấn đề 1: Xuất toàn bộ dữ liệu trong Listview (hoặc Datagridview) vào file đang làm việc. (dữ liệu sẽ bắt đầu từ ô mình đang chọn trong excel)

Vấn đề 2: Khi double click chuột vào Listview (hoặc Datagridview) thì dữ liệu của 1 dòng (trừ cột STT) đó sẽ được thêm vào file đang làm việc. (dữ liệu sẽ được thêm vào ô mình đang chọn trong excel)

Ví dụ: Em mở file GPE.xlsx và nhấn Button trên ribbon để lấy dữ liệu vào Listview (hoặc Datagridview). Sau đó mở tiếp file GPE-1.xlsx (file có thể thay đổi), chọn vị trí ô để xuất dự liệu và nhấn Export để xuất dữ liệu.

Em cảm ơn.
 
Web KT
Back
Top Bottom