Set DataSource cho DataGridView bằng cách dùng Array (2 người xem)

  • Thread starter Thread starter vba_gpe
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
Gửi anh chị trên diễn đàn.
Em có một vấn đề nhờ anh chị xem giúp: Em thực hiện tìm kiếm dữ liệu và đưa vào DataGridView như sau:
1. Dùng hàm Filter2DArray tham khảo của thầy NDU để tìm kiếm dữ liệu, trích xuất ra được 1 mảng.
2. Em muốn set .Datasource mảng đó cho DataGridView hiểu và load dữ liệu lên.
(Nhưng ở bước 2 em không biết phải làm như thế nào để cho Gridview hiểu kết quả xuất từ hàm Filter2DArray đúng định dạng cho control này). Em nhờ anh chị hướng dẫn giúp:
Hàm Filter2DArray của thầy NDU:
PHP:
Function Filter2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
  Dim TmpArr, i As Long, j As Long, arr, Dic, TmpStr, Tmp, Chk As Boolean, TmpVal As Double
  On Error Resume Next
  Set Dic = CreateObject("Scripting.Dictionary")
  TmpArr = sArray
  ColIndex = ColIndex + LBound(TmpArr, 2) - 1
  Chk = (InStr("><=", Left(FindStr, 1)) > 0)
  For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
    If Chk And FindStr <> "" Then
      TmpVal = CDbl(TmpArr(i, ColIndex))
      If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
    Else
      If Left(FindStr, 1) = "!" Then
        If Not (UCase(TmpArr(i, ColIndex)) Like UCase(Mid(FindStr, 2, Len(FindStr)))) Then Dic.Add i, ""
      Else
        If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
      End If
    End If
  Next
  If Dic.Count > 0 Then
    Tmp = Dic.Keys
    ReDim arr(LBound(TmpArr, 1) To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle, LBound(TmpArr, 2) To UBound(TmpArr, 2))
    For i = LBound(TmpArr, 1) - HasTitle To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle
      For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
        arr(i, j) = TmpArr(Tmp(i - LBound(TmpArr, 1) + HasTitle), j)
      Next
    Next
    If HasTitle Then
      For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
        arr(LBound(TmpArr, 1), j) = TmpArr(LBound(TmpArr, 1), j)
      Next
    End If
  End If
  Filter2DArray = arr
End Function

Trân trọng, kính chúc anh chị sức khỏe.
Mong nhận được hồi đáp của mọi người.
 
Gửi anh chị trên diễn đàn.
Em có một vấn đề nhờ anh chị xem giúp: Em thực hiện tìm kiếm dữ liệu và đưa vào DataGridView như sau:
1. Dùng hàm Filter2DArray tham khảo của thầy NDU để tìm kiếm dữ liệu, trích xuất ra được 1 mảng.
2. Em muốn set .Datasource mảng đó cho DataGridView hiểu và load dữ liệu lên.
(Nhưng ở bước 2 em không biết phải làm như thế nào để cho Gridview hiểu kết quả xuất từ hàm Filter2DArray đúng định dạng cho control này). Em nhờ anh chị hướng dẫn giúp:
.
Bạn đưa 1 file đơn giản (có 1 ít dữ liệu) và có cái control DataGridView lên đây để test chứ!
 

File đính kèm

Ôi... cái thằng control này khó dùng quá (hoặc là tôi không biết cách dùng)
Sao bạn không xài loại này cho dễ:
http://www.giaiphapexcel.com/forum/...vấn-Excel-Database-vào-các-control-ở-Userform
Em có thử cái FlexGrid giống như trong bài thầy đưa tham khảo (MSFLXGRD.OCX ) nhưng em thấy không được. Có lẽ bên VBA nó không chịu 2 cái Ctrol này (DataGrid và FlexGrid). Có 2 vấn đề em nhờ thấy và mọi người chỉ giáo:

1. Trong bài của anh Hai lúa miền tây em thấy trong cái ảnh lúc load cái control FlexGrid có chữ gì (Hình như là Microsoft Herachical ...FlexGrid Controls 6.0). Còn bên cái của em không phải vây (Bên em chỉ là Microsoft FlexGrid Cotrol 6.0). Không biết có phải là một hay không?

2. Có phải vì lý do 1 hay không mà sau khi em load cái FlexGrid xong, lúc đưa vào Form thì hiện ra cái lỗi:"The Subject is not Trusted for the specified action". Không biết mọi người có gặp như vậy không? Cái lỗi đó cũng chính là lỗi mà em thấy khi add cái DataGrid vào userform VBA. Cái cotrol trong ví dụ em gửi lên nó là DataList. (Cũng của ông DataGird View).

Mong mọi người đóng góp .
Trân trọng.
 
Với Flexgrid thì không dùng truyền Mảng trực tiếp được mà phải truyền từng giá trị qua thuộc tính TextMatrix thôi. Nhưng có cái này phải nói thật là FlexGrid không hỗ trợ unicode đâu nhé.
Thủ tục bạn cần bổ sung vào file mẫu như sau:
PHP:
' Copy the array data into the grid.
Private Sub CopyArrayToGrid(ByRef m_ArrayData As Variant, ByVal grd As Object)
    Dim rmin As Integer
    Dim cmin As Integer
    Dim rmax As Integer
    Dim cmax As Integer
    Dim r As Integer
    Dim c As Integer

    rmin = LBound(m_ArrayData, 1)
    rmax = UBound(m_ArrayData, 1)
    cmin = LBound(m_ArrayData, 2)
    cmax = UBound(m_ArrayData, 2)
    grd.Rows = rmax - rmin + 1
    grd.Cols = cmax - cmin + 1
    grd.FixedCols = 0
    grd.FixedRows = 0

    For r = rmin To rmax
        For c = cmin To cmax
            grd.TextMatrix(r - rmin, c - cmin) = _
                m_ArrayData(r, c)
        Next c
    Next r
End Sub
Thủ tục CommandButton2_Click() bạn thay thế bằng đoạn sau.
PHP:
Private Sub CommandButton2_Click()
  Dim arr As Variant, FindStr As String, Col As Long
  On Error Resume Next
  FindStr = "*" & Trim(Me.Txt_Tim.Value) & "*"
  If Len(Trim(Me.Txt_Tim.Value)) = 0 Then ListBox1.List() = sArray: Exit Sub
  arr = Filter2DArray(sArray, 1, FindStr, False)
  If Not IsArray(arr) Then
     arr = Filter2DArray(sArray, 2, FindStr, False)
  End If
  If Not IsArray(arr) Then ListBox1.Clear: Exit Sub
  ListBox1.List() = IIf(Trim(Me.Txt_Tim.Value) = "", sArray, arr)
  CopyArrayToGrid arr, MSFlexGrid1
End Sub

Khi nhấn nút tìm thì sẽ giả về kết quả. Tuy nhiên bạn cần thêm Điều khiển vào Project đồng thời bỏ tham chiếu cái datalist đi nhe. Xem file đính kèm
 

File đính kèm

Lần chỉnh sửa cuối:
Web KT

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

Trả lời
41
Đọc
17K
Back
Top Bottom